У меня есть сервер 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}"));
Я вызываю POST на /orders/1/something
, и в теле я передаю 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);
}
Проблема, с которой я столкнулся, заключается в том, что здесь в журнале body только «1», который является параметром пути, что означает, что я не получаю то, что передаю как body в запросе 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}
. Может мне что-то здесь не хватает?