2010-11-16 2 views
2

Mon application est une webapp java (WAR) qui utilise Apache Camel et (entre autres) CXF-RS et son composant Camel correspondant comme une implémentation de JAX-RS pour fournir des services ReSTful au monde extérieur. Lorsque j'appelle l'un des points de terminaison avec un POST HTTP et une charge utile valide, j'obtiens la trace de la pile Exception comme vous pouvez le voir ci-dessous.Pourquoi ai-je une exception NullpointerException lors de l'appel du point de terminaison CXF-RS d'une route Camel?

Notez que les classes com.foo.FooService et com.foo.Foo sont une paire de service/ressource annotée JAXRS. Je suis particulièrement confus que la méthode create() soit réellement appelée car je crois comprendre que CXF-RS pour Camel effectue une certaine magie pour intercepter les requêtes entrantes et acheminer la requête dans une route Camel.

Ce sont des versions simplifiées des classes:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Foo implements Serializable { 
// some getters and setters go here 
} 


@Path("/") 
public class FooService { 

    public FooService() { 
    } 

    @POST 
    @Path("/foos") 
    @Consumes("application/xml") 
    public Response create(Foo foo) { 
     throw new UnsupportedOperationException(); 
    } 
} 

configurer le CxF: rsServer comme suit dans mon XML Spring:

<cxf:rsServer id="fooServer" serviceClass="com.foo.FooService" address="/foorest"/> 

L'itinéraire est défini en Java comme suit:

from("cxfrs://bean://fooServer").id("foo-restadapter-route") 
    .to("jms:queue:foos").inOnly(); 

Voici l'exception comme je l'ai:

SEVERE: Error occurred during error handling, give up! 
org.apache.cxf.interceptor.Fault: null while invoking public javax.ws.rs.core.Response com.foo.FooService.create(com.foo.Foo) with params [[email protected]]. 
     at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:159) 
     at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:133) 
     at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:133) 
     at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:82) 
     at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
     at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37) 
     at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:106) 
     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.doPost(AbstractHTTPServlet.java:103) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
     at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
     at java.lang.Thread.run(Thread.java:662) 
Caused by: java.lang.NullPointerException 
     at org.apache.camel.component.cxf.jaxrs.CxfRsInvoker.getContinuation(CxfRsInvoker.java:63) 
     at org.apache.camel.component.cxf.jaxrs.CxfRsInvoker.performInvocation(CxfRsInvoker.java:52) 
     at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:89) 
     ... 33 more 

Répondre

0

Il est a bug de chameau CxF, vous pouvez contourner ce problème en changeant la route comme celui-ci

from("cxfrs://bean://fooServer?synchronous=true").id("foo-restadapter-route") 
.to("jms:queue:foos").inOnly(); 
+0

Oui, je suis en fait dans le code source, tout compris et déposé ce bug avec Camel mysel . ;) Mais merci pour la solution de contournement, ne savais pas que vous pourriez forcer des requêtes synchrones comme celle-ci. –

+0

L'URL indiquée ne fonctionne plus: Elle a été déplacée à: https://issues.apache.org/jira/browse/CAMEL-3343 –

Questions connexes