【发布时间】:2017-08-22 19:08:49
【问题描述】:
我有一个 JAX-RS 休息服务,其 POST 方法如下所示:
...
@Path("/post1/")
@POST
@Produces({MediaType.TEXT_PLAIN})
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response post(@Context javax.servlet.http.HttpServletRequest request, ContainerListType containerListType) throws Exception, Throwable, RuntimeException {
Response response = null;
try {
List<ContainerType> containerList = containerListType.getContainer(); <=== null value: "containerListType" is null!
ContainerType ct = containerList.get(0);
URI uri = UriBuilder.fromUri(uriInfo.getRequestUri()).path(ct.getFielda()).path(ct.getFieldb()).path(ct.getFieldc()).build();
response = Response.created(uri).build();
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
...
(注意:使用工具测试上述 POST 操作 - 即,像 FireFox 插件:“HttpRequestor” - 适用于发布 - JSON 和 XML 消息。)
我正在尝试使用“to”进行 POST 操作。方法如下图(在RouteBuilder类中)。
...
from("direct:thingH")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setBody("{'container':[{'fielda': '...this is fielda value...','fieldb': '...this is fielda value...','fieldc': '...this is fielda value...'}]}");
}
})
.log("---------------------- (from(\"direct:thingH\")) ----------------------> process yields...:" + body().toString())
.to("restlet:http://localhost:7001/jaxrsRestService/service/post1/?restletMethod=POST&exchangePattern=InOut");
...
注意:日志条目似乎表明“正文”不为空:
2017-08-24 11:17:19,488 | INFO | stlet-1261331139 | route42 | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingH")) ----------------------> process yields...:simple{{'container':[{'fielda': '...this is fielda value...','fieldb': '...this is fielda value...','fieldc': '...this is fielda value...'}]}}
但执行 post 方法会产生 java.lang.NullPointerException - 即 REST 服务的 POST 方法中的“containerListType”参数为空。这是为什么呢?
...
java.lang.NullPointerException
at aaa.bbb.ccc.JaxrsRestService.post(JaxrsRestService.java:51)
at sun.reflect.GeneratedMethodAccessor949.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:471)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:425)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:383)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:336)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:223)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:286)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:260)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:137)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:350)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:247)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3679)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3649)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:326)
at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197)
at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203)
at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71)
at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2433)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2281)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2259)
at weblogic.servlet.internal.ServletRequestImpl.runInternal(ServletRequestImpl.java:1691)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1651)
at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:270)
at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:348)
at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:333)
at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:54)
at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41)
at weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:640)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:406)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:346)
...
发生 NullPointerException 是因为调用“post1”方法时,POST 的“ContainerListType”值为 null:为什么是 null?
是否以这种方式调用 REST/POST 操作 - 即,以任何方式使用“to()”方法不正确/不正确?:
.to("restlet:http://localhost:7001/jaxrsRestService/service/post1/?restletMethod=POST&exchangePattern=InOut");
或者,我是否需要从处理器内部执行客户端 REST 调用?
为什么发布的对象为空? FWIW:我在发布之前检查了 body() - 使用日志记录 - 它不为空。
其他环境信息:
jdk1.8.0_131
jboss-fuse-6.3.0.redhat-187
WebLogic 12.2.1 (running the rest service)
【问题讨论】:
-
这个问题 [ibm-mq] 的任何部分是否相关?
-
好点,乔希。我现在将删除该标签引用。谢谢!
-
如果我是你,我会简单地编写一个测试来测试 restlet 端点,而不是挖掘大量代码。 FWIW,我在文档中没有看到任何 POST 生产者的示例,但是 Camel 文档的质量并不是非常高。
-
嗨 Abhijit - 不确定你的意思。使用 HttpRequestor 之类的工具从外部进行测试时,端点可以工作。我同意,Camel 文档经常过时。不容易确定明确/当前的例子。它们通常也偏向“弹簧”方向。
标签: apache-camel jax-rs jbossfuse blueprint-osgi