Только первый параметр принят в 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}"));

Я вызываю 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}. Может мне что-то здесь не хватает?


person Farid Jafri    schedule 03.05.2017    source источник


Ответы (1)


Вот и разобрался. Входное тело POST может быть указано в качестве первого аргумента. Это делает тело объекта Exchange переданным телом. @PathParam или любые другие параметры могут быть размещены позже и доступны через exchange.getIn().getHeader("id"), поскольку все такие параметры доступны из заголовков.

person Farid Jafri    schedule 03.05.2017