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.

Reply via email to