While trying to move an axis2 web-app from glassfish3 to tomcat6, I can’t seem to find a way to get a config parameter from a static context.
In glassfish3, a system property was defined in a far away place and read from the application using System.getProperty(String name). Not only does the web agree that this is not the way to go for a web application, this trick is just not feasible for tomcat (tomcat docs).
Reading parameters from the ServletContext is also not feasible as the app uses axis2 and I can’t seem to find a way to access any kind of servlet voodoo from the static context that initializes the app’s configuration.
services.xml (the file containing the service description for axis2) can contain <parameter> nodes, so that seems a nice place to configure the configuration location, but I can’t seem to find a way to read these parameters from the application.
So in short: any ideas on how to get a value configured outside the application’s code available from a static context?
(answer listed here as StackOverflow does not allow me to answer my own question…)
After scouring the Internet some more, a solution was found using an implementation of org.apache.axis2.engine.ServiceLifeCycle, which could read a parameter in the startUp-method as such:
Parameter param = service.getParameter("name");
if (param != null) {
saveParamValue(param.getValue().toString());
} else {
// log warning on falling back to System.getProperty()
}
The life cycle class is attached using class="fully.qualified.ClassName" on the <service> node of the services.xml file used by axis2.
This works, now the application just crashes on something else (but that has little to with this issue).
The parameters in
services.xmlcan be accessed by getting theServiceContextobject for the service, then callingServiceContext.getParameter(). If your service implementation class implements the Lifecycle interface, then Axis2 will callLifecycle.init()every time it creates a new instance of the service class. The argument toLifecycle.init()is the service’sServiceContext. Yourinit()implementation could save the context object or look up the parameters that you’re interested in.