Hi,
I'm trying to migrate a set of services from XFire to CXF. The services
are configured 100% programmatically through the XFire API (no .xml
files), and I'd like to do the same with CXF. At the moment all the
service classes are just POJOs; ie. there are no annotations on them.
Under XFire, my web.xml has the following in it:
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>
org.codehaus.xfire.transport.http.XFireServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/Services/*</url-pattern>
</servlet-mapping>
<listener>
<listener-class>
com.vexeddigital.service.listener.XFireServletContextListener
</listener-class>
</listener>
The class XFireServletContextListener then configures the services as
follows:
XFire xfire = XFireFactory.newInstance().getXFire();
ServiceFactory factory = new
ObjectServiceFactory(xfire.getTransportManager(), null);
for(String serviceName : ConfigurationManager.getServiceNames())
{
Map<String,Object> serviceProperties = null;
if(ConfigurationManager.getCustomisedCoreClassesByService(serviceName)!=null)
{
serviceProperties = new HashMap<String,Object>();
serviceProperties.put(AegisBindingProvider.WRITE_XSI_TYPE_KEY,
"true");
List<String> overrideTypesList = new ArrayList<String>();
for(String className :
ConfigurationManager.getCustomisedCoreClassesByService(serviceName))
overrideTypesList.add(className);
serviceProperties.put(AegisBindingProvider.OVERRIDE_TYPES_KEY,
overrideTypesList);
}
Service service = factory.create(
Class.forName("com.vexeddigital.service." + serviceName),
serviceName, "http://service.vexeddigital.com/" +
serviceName, serviceProperties);
xfire.getServiceRegistry().register(service);
}
...the class ConfigurationManager is of course application specific.
I've tried to convert this to CXF - the web.xml I believe is fairly
straightforward:
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/Services/*</url-pattern>
</servlet-mapping>
<listener>
<listener-class>
com.vexeddigital.service.listener.CXFServletContextListener
</listener-class>
</listener>
The revised listener class is however proving to be more problematic.
I've tried various things after looking through the documenation/API's
and mailing list - I believe getting the Bus in CXF is similar to
getting an XFire object, and then I've tried configuring the services
using ReflectionServiceFactoryBean, ServerFactoryBean and Endpoint
classes but either get exceptions thrown or get this message:
WARNING: Can't find the the request for
http://localhost:8080/VXServices/Services/SearchService's Observer
Any help would be appreciated - especially if someone can provide a
direct translation for the XFire code above into the CXF equivalent.
Ben.