2010-11-16 20 views
2

我的應用程序是一個java Web應用程序(WAR),它使用Apache Camel和CXF-RS及其相應的Camel組件作爲JAX-RS的實現,爲外部世界提供ReSTful服務。爲什麼在調用Camel路由的CXF-RS端點時會出現NullpointerException?

當使用HTTP POST和有效負載調用其中一個端點時,我將獲得異常堆棧跟蹤,如下所示。請注意,com.foo.FooService和com.foo.Foo類是JAXRS註釋的服務/資源對。

我特別困惑的是create()方法實際上是被調用的,因爲我的理解是Camel的CXF-RS以某種方式執行一些魔術來截獲傳入請求並將請求路由到Camel路由。

這些都是類的簡化版本:

@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(); 
    } 
} 

我配置CXF:rsServer在我的Spring XML如下:

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

路線是用Java定義如下:

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

這是我的例外:

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 

回答

0

這是駱駝CXF的a bug,你可以通過改變這樣的

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

是的,其實我走進了源代碼,理解了它,並提交該缺陷與駱駝mysel途徑解決此問題。 ;)但是,感謝解決方法,不知道你可以強制像這樣的同步請求。 – 2010-11-18 06:33:50

+0

給定的URL不再有效:已將其移至:https://issues.apache.org/jira/browse/CAMEL-3343 – 2017-05-16 12:40:20

相關問題