camel cxf 只接受第一个参数
Only first parameter accepted in camel cxf
我有一个 cxf 服务器在 camel.xml 中定义为:
<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);
}
我面临的问题是,在日志中,正文只有“1”,这是路径参数,这意味着我没有得到我在 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 网络服务正在获取参数,但只有第一个参数以某种方式传递给 direct-vm:${header.operationName}
。也许我在这里遗漏了什么?
所以我想通了。输入 POST body 可以作为第一个参数。这使得 Exchange object 的 body 成为传递的 body。 @PathParam
或任何其他参数可以稍后放置并通过 exchange.getIn().getHeader("id")
访问,因为所有此类参数都是从 headers.
访问的
我有一个 cxf 服务器在 camel.xml 中定义为:
<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);
}
我面临的问题是,在日志中,正文只有“1”,这是路径参数,这意味着我没有得到我在 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 网络服务正在获取参数,但只有第一个参数以某种方式传递给 direct-vm:${header.operationName}
。也许我在这里遗漏了什么?
所以我想通了。输入 POST body 可以作为第一个参数。这使得 Exchange object 的 body 成为传递的 body。 @PathParam
或任何其他参数可以稍后放置并通过 exchange.getIn().getHeader("id")
访问,因为所有此类参数都是从 headers.