当调用Camel路由的CXF-RS端点时,为什么会出现NullpointerException?

3

我的应用是一个Java Web应用程序(WAR),使用Apache Camel以及(其中之一)CXF-RS和相应的Camel组件作为JAX-RS的实现,向外界提供RESTful服务。

当使用HTTP POST和有效负载调用其中一个端点时,我会得到以下异常堆栈跟踪。请注意,com.foo.FooService和com.foo.Foo类是JAXRS注解的服务/资源对。

我特别困惑的是create()方法实际上被调用了,因为我的理解是,CXF-RS for Camel会执行某些魔法来拦截传入的请求并将请求路由到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();
    }
}

在我的Spring XML中,我将cxf:rsServer配置如下:

<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 [com.foo.Foo@1ed43997].
        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
1个回答

0

这是camel-cxf一个bug,您可以通过更改路由来解决此问题。

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

是的,我实际上进入了源代码,弄清楚了问题,并自己向Camel提交了该错误。;)但还是谢谢你提供的解决方法,我不知道你可以像这样强制同步请求。 - Boris Terzic
给定的URL不再可用:它已经被移动到:https://issues.apache.org/jira/browse/CAMEL-3343 - ST-DDT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接