我在camel.xml中定义了一个cxf服务器:
<cxf:rsServer id="rsServer" address="http://0.0.0.0:9090/orderservice"
serviceClass="my.pakcage.myClass" />
我将REST服务定义为:
@POST
@Path("/orders/{id}/something")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response changeOrderSomething(@PathParam("id") String orderId, @Body String somethingPayload) {
return null;
}
在Java DSL中,我有骆驼路线:
from("rsServer?bindingStyle=Default").log("rsServerlogging: ${body}")
.recipientList(simple("direct-vm:${header.operationName}"));
我在/orders/1/something
上调用POST,在正文中我传递了一个json:{"somethingId":"3"}
后来我有一条接受direct-vm:changeOrderSomething
并将其传递给处理器的路线:
@Override
public void process(Exchange exchange) throws Exception {
String body = exchange.getIn().getBody(String.class);
LOG.info("exchange.getIn body is: {}", body);
}
我面临的问题是,在日志中,身体只是&#34; 1&#34;这是路径参数,这意味着我没有得到我在POST请求中作为正文传递的内容。如果我将REST服务中的参数顺序更改为@Body String somethingPayload, @PathParam("id") String orderId
,我将获得通过的json而不是路径参数。
我该怎么做才能把我在REST中作为参数传递的所有东西都拿出来?
更新
我错误地在某个地方调用了Object [],所以它引发了异常:
org.apache.cxf.interceptor.Fault: Failed to invoke method: [0] on null due to: java.lang.IndexOutOfBoundsException: Key: 0 not found in bean: 1 of type: java.lang.String using OGNL path [[0]] while invoking public javax.ws.rs.core.Response my.package.myClass.changeOrderSomething(java.lang.String,java.lang.String) with params [1, {
"somethingId":"3"}]
我认为这意味着REST Web服务正在获取参数,但只有第一个以某种方式传递给direct-vm:${header.operationName}
。也许我在这里错过了什么?
答案 0 :(得分:0)
所以我明白了。输入POST主体可以作为第一个参数。这使得Exchange对象的主体成为传递的主体。 @PathParam
或任何其他参数可以稍后放置,并通过exchange.getIn().getHeader("id")
访问,因为所有这些参数都是从标题中访问的。