Camel POST RestService, принимающий JSONArray: аннотации и ошибки синтаксического анализа - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь построить маршрут Apache Camel (v2.15) для обработки запроса POST для службы REST.

Ожидаемые запросы POST будут выглядеть следующим образом (JSONArray, представляющий список JSONObjects)это все экземпляры одного заданного типа):

Content-Type:application/json;charset=UTF-8

[
    {
        "aaa": "TEST",
        "bbb": "TEST",
        "ccc": 5004000
    },
    {
        "aaa": "TEXT",
        "bbb": "TEXT",
        "ccc": 5004001
    },
    ...
]

Моя проблема состоит в том, чтобы сконфигурировать вещи для правильной несериализации тела POST ...

Вотопределение маршрута:

from("cxfrs:bean:messageServer").choice()
        .when(header("operationName").isEqualTo("postJsonMessage"))
        .beanRef("messageService", "postJsonMessage")
        .end();

Теперь определение службы, на которое ссылается строка beanRef:

@Path("/root-path/")
public class MyService {
    private final Logger logger = LoggerFactory.getLogger(MyService.class);

    @POST
    @Path("/message/")
    @Consumes(MediaType.APPLICATION_JSON + ";charset=UTF-8")
    public void postJsonMessage(@Body final List<CustomMessage> data) {
        logger.info("body size :" + data.size());
    }
}

И POJO, описывающее элементы несериализованного списка:

public class CustomMessage {
    private String aaa;
    private String bbb;
    private int ccc;

    // ...getters and setters...
}

Когда я не использую аннотацию в POJO, я получаю следующее исключение:

JAXRSUtils | 152 - org.apache.cxf.cxf-core - 3.0.6 | No message body reader has been found for class java.util.List, ContentType: application/json;charset=UTF-8

Но если я использую @ XMLRootElement в POJO, я получаю JSONисключение при разборе:

AbstractJAXBProvider | 152 - org.apache.cxf.cxf-core - 3.0.6 | javax.xml.stream.XMLStreamException: ParseError at [row,col]:[0,1] Message: A JSONObject text must begin with '{' at character 1 of [
    {
        "aaa": "TEST",
        "bbb": "TEST",
        "ccc": 5004000
    },
    ...

Так как я могу настроить синтаксический анализатор для интерпретации опубликованных данных как JSONArray, а не как JSONObject?

Заранее спасибо за любыепомощь:)

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Наконец, решение моей проблемы было найдено с помощью org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider и определения типа массива для параметра @Body:

Итак, в camel-context.xml мы определили поставщика и установилисвязанные библиотеки в osgi:

<cxf:rsServer id="messageServer"
    address="http://0.0.0.0:${rest.service.message.port}"
    serviceClass="com.example.service.MyService">
    <cxf:providers>
        <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" />
    </cxf:providers>
</cxf:rsServer>

Необходимые библиотеки (в нашей среде):

install mvn:org.codehaus.jackson/jackson-core-asl/1.9.12
install mvn:org.codehaus.jackson/jackson-mapper-asl/1.9.12
install mvn:org.codehaus.jackson/jackson-jaxrs/1.9.12
install mvn:org.codehaus.jackson/jackson-xc/1.9.12

Затем сигнатура метода службы была изменена, чтобы ожидать массив * 1012.* objects:

    @POST
    @Path("/message/")
    @Consumes(MediaType.APPLICATION_JSON + ";charset=UTF-8")
    public void postJsonMessage(@Body final CustomMessage[] data) {
        // process data...
    }

Также в построитель маршрутов добавлено определение типа:

    from("cxfrs:bean:messageServer").choice()
            .when(header("operationName").isEqualTo("postJsonMessage"))
            .convertBodyTo(CustomMessage[].class)
            .beanRef("messageService", "postJsonMessage")
            .end();
0 голосов
/ 19 октября 2018

Я помню, что сталкивался с подобной проблемой (но с сортировкой).Обходной путь заключался в том, чтобы определить оболочку вокруг списка, чтобы библиотека Jackson теперь могла отменять вызов вашей полезной нагрузки JSON

public class CustomMessageList extends ArrayList<CustomMessage> {};

@POST
@Path("/message/")
@Consumes(MediaType.APPLICATION_JSON + ";charset=UTF-8")
public void postJsonMessage(@Body final CustomMessageList data) {
   logger.info("body size :" + data.size());
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...