Rest 如何使用Jersey客户端将复杂对象发送到jax rc服务器?
我设计了一个REST客户端和服务器。服务器使用spring和CXF以及一些@procoduce和@consumer某些对象的服务。这是服务的原型:Rest 如何使用Jersey客户端将复杂对象发送到jax rc服务器?,rest,jersey,cxf,jax-rs,jersey-client,Rest,Jersey,Cxf,Jax Rs,Jersey Client,我设计了一个REST客户端和服务器。服务器使用spring和CXF以及一些@procoduce和@consumer某些对象的服务。这是服务的原型: @GET @Produces("application/xml") @Path("/Order/Id/{orderId}") public Order getOrder(@PathParam("orderId") String officeId); @GET @Produces("application/xml") @Path("/Order/Al
@GET
@Produces("application/xml")
@Path("/Order/Id/{orderId}")
public Order getOrder(@PathParam("orderId") String officeId);
@GET
@Produces("application/xml")
@Path("/Order/All")
public OrderList getAllOrders();
@POST
@Consumes("application/xml")
@Path("/Order/")
public String sendOrder(Order order);
使用/Order/All
路径获取请求,响应正确,但当我使用Jersey客户端发布到/Order/
路径时,响应不起作用。这是客户端代码:
Client client = Client.create();
WebResource webResource = client.resource("server address/Order/");
ClientResponse response = webResource.accept(MediaType.APPLICATION_XML).type(MediaType.APPLICATION_XML)
.post(ClientResponse.class, `an order object`);
我在服务器上得到了这个异常:
2014-01-26 12:22:33 WARN JAXRSUtils:499 - No operation matching request path "/services/Order/Hey" is found, Relative Path: /Order/, HTTP Method: POST, ContentType: application/xml, Accept: application/xml,. Please enable FINE/TRACE log level for more details.
2014-01-26 12:22:33 WARN WebApplicationExceptionMapper:73 - javax.ws.rs.ClientErrorException
at org.apache.cxf.jaxrs.utils.JAXRSUtils.findTargetMethod(JAXRSUtils.java:503)
at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:218)
at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:90)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)
at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:595)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:366)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:724)
您的目标不是
POST
请求/services/Order/
,而是/services/Order/Hey
(这是个例外)。您的应用程序中不存在此资源。检查客户端是否使用了正确的URI,或者您的应用程序是否包含任何能够更改请求URI的筛选器。您的REST模式没有遵循最常见的约定。这会引起混乱!特别是,通常将订单集合建模为单个资源,例如,/orders
,并将单个订单作为子资源,/orders/{id}
。要实现这一点,您需要对方法进行如下注释:
@GET
@生成(“应用程序/xml”)
@路径(“/Order/{orderId}”)
公共订单getOrder(@PathParam(“orderId”)字符串orderId);
@得到
@生成(“应用程序/xml”)
@路径(“/顺序”)
public OrderList getAllOrders();
@职位
@使用(“应用程序/xml”)
@生成(“文本/纯文本”)
@路径(“/顺序”)
公共字符串sendOrder(订单);
(您可能希望从那里的POST处理程序返回一个响应
,也可能传递一个@Context-UriInfo-ui
参数;这将允许您发送一个重定向到创建的订单资源。但这并不是很关键。)
完成此操作后,对/services/Order/Hey
的GET请求将变得有意义,从而调用实现的getOrder
方法,并将orderId
设置为“Hey
”