Hi List,

I've managed to get CXF DOSGi 1.2 working with JSON responses following
the discussions I found on this list. However, I've hit a problem when I
try to use the OSGi HTTP Service via the
org.apache.cxf.ws.httpservice.context property.

So I've adapted the greeter rest sample from the distribution and added
the following properties to the services :


        props.put("service.exported.interfaces", "*");
        props.put("service.exported.configs", "org.apache.cxf.rs");
        props.put("service.exported.intents", "HTTP");
        
props.put("org.apache.cxf.rs.provider","org.apache.cxf.jaxrs.provider.AegisElementProvider,org.apache.cxf.jaxrs.provider.AegisJSONProvider");

Then for the first case I register an address for the service to use,
e.g.

        props.put("org.apache.cxf.rs.address","http://localhost:8282/greeter2";);

This works like a charm : curl
http://localhost:8282/greeter2/greeter/greeting/fred
{"ns1.GreeterInfo":{"@xsi.type":"ns1:GreeterInfo","ns1.greetings":{"ns1.GreetingPhrase":[{"@xsi.type":"ns1:GreetingPhrase","ns1.name":"fred","ns1.phrase":"Hello"},{"@xsi.type":"ns1:GreetingPhrase","ns1.name":"fred","ns1.phrase":"Hoi"},{"@xsi.type":"ns1:GreetingPhrase","ns1.name":"fred","ns1.phrase":"Hola"},{"@xsi.type":"ns1:GreetingPhrase","ns1.name":"fred","ns1.phrase":"Bonjour"}]}}}



However, it blows up when I try and register with a context instead of
an address. So that last property above is replaced with this :

        props.put("org.apache.cxf.rs.httpservice.context","/greeter2");

Now when I issue the curl command I get this exception in Felix :

27-Oct-2011 16:11:08
org.apache.cxf.dosgi.dsw.handlers.SecurityDelegatingHttpContext
handleSecurity
INFO: No filter registered.
Delegating from GreeterServiceImpl2 to GreeterServiceImpl
Invoking: greetMe(fred)
java.lang.ExceptionInInitializerError
        at
        
org.apache.cxf.aegis.AegisContext.createRootTypeCreator(AegisContext.java:119)
        at
        
org.apache.cxf.aegis.AegisContext.createTypeCreator(AegisContext.java:108)
        at
        org.apache.cxf.aegis.AegisContext.initialize(AegisContext.java:150)
        at
        
org.apache.cxf.jaxrs.provider.AbstractAegisProvider.getClassContext(AbstractAegisProvider.java:123)
        at
        
org.apache.cxf.jaxrs.provider.AbstractAegisProvider.getAegisContext(AbstractAegisProvider.java:80)
        at
        
org.apache.cxf.jaxrs.provider.AegisElementProvider.writeTo(AegisElementProvider.java:74)
        at
        
org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:248)
        at
        
org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.processResponse(JAXRSOutInterceptor.java:139)
        at
        
org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleMessage(JAXRSOutInterceptor.java:78)
        at
        
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)
        at
        
org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:78)
        at
        
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)
        at
        
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:110)
        at
        
org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:98)
        at
        
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:423)
        at
        
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:139)
        at
        
org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:142)
        at
        
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179)
        at
        
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:108)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
        at
        
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159)
        at
        org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
        at
        org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
        at
        
org.ops4j.pax.web.service.internal.HttpServiceServletHandler.handle(HttpServiceServletHandler.java:66)
        at
        org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
        at
        org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
        at
        
org.ops4j.pax.web.service.internal.HttpServiceContext.handle(HttpServiceContext.java:108)
        at
        
org.ops4j.pax.web.service.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:64)
        at
        org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
        at org.mortbay.jetty.Server.handle(Server.java:324)
        at
        org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
        at
        
org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:829)
        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:513)
        at
        org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
        at
        org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
        at
        
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
        at
        
org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
Caused by: java.lang.IllegalArgumentException: No SchemaFactory that
implements the schema language specified by:
http://www.w3.org/2001/XMLSchema could be loaded
        at javax.xml.validation.SchemaFactory.newInstance(Unknown
        Source)
        at
        
org.apache.cxf.aegis.type.XMLTypeCreator.<clinit>(XMLTypeCreator.java:118)

This is using Java 1.6.0_27, CXF DOSGi 1.2 and Felix 3.2.2. I configured
felix as per the conf in the cxf distribution with the addition of the
jettison jar and my modified greeter bundle - config is viewable at
http://pastebin.com/m8Qa8pLw

I can work around this, in that if I set the address to be the same as
the OSGi HTTP service is already using then that works fine, but I'd
rather not do that as we would need to remember to change the property
if we ever change the port to be consistent.

Any help would be gratefully received.

Thanks,

Jon. 

Reply via email to