API REST в Camel - POST не работает (ошибка синтаксического анализа XML)

Я пытаюсь создать пример маршрута Camel в качестве семени для RESTful API, построенного на простом классе ресурсов, обеспечивающем полезную нагрузку XML.

Проблема, с которой я столкнулся, заключается в том, что мой GET работает (все, что он делает - это строит кусок XML), но мой POST возвращает следующую ошибку:

JAXBException occurred : ParseError at [row,col]:[1,1]
Message: Premature end of file.. ParseError at [row,col]:[1,1]
Message: Premature end of file..

Я использую класс, построенный из XSD через xjc, для определения XML. Я знаю, что это не проблема со структурой полезной нагрузки XML, так как даже происходит сбой, когда я копирую XML, возвращаемый GET, в POST! Тем не менее, учитывая, что JAXB жалуется на самого первого символа, мне интересно, жалуется ли он на кодировку. Я использовал и cURL, и Chrome Postman в качестве клиентов, оба получили одинаковый ответ.

Я думаю, что я просто пропускаю простую аннотацию или настройку, которая включает метод POST (newCustomer) для анализа входящей полезной нагрузки XML.

Вот мой маршрут XML: -

<?xml version="1.0" encoding="UTF-8"?>
<blueprint
    xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs"
    xmlns:cxf="http://cxf.apache.org/blueprint/core"
    xmlns:camel="http://camel.apache.org/schema/blueprint"
    xsi:schemaLocation="
http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://cxf.apache.org/blueprint/jaxrs http://cxf.apache.org/schemas/blueprint/jaxrs.xsd
http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd
http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd
">

    <camelContext id="goochjs-cameltest-customer" trace="false" xmlns="http://camel.apache.org/schema/blueprint">

        <route id="jetty">
            <from uri="jetty:http://0.0.0.0:8892/rest?matchOnUriPrefix=true" />
            <log logName="goochjs" loggingLevel="INFO" message="Request received 1: ${body}" />
            <to uri="cxfbean:customerResource" />
        </route>
    </camelContext>

    <bean id="customerResource" class="org.goochjs.cameltest.CustomerResourceImpl" />
</blueprint>

... и мой класс ресурсов...

package org.goochjs.cameltest;

import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Path("/customers")
public class CustomerResourceImpl {

    @POST
    @Path("/{type}")
    public Response newCustomer(Customer customer, @PathParam("type") String type, @QueryParam("active") @DefaultValue("true") boolean active) {
        return Response.ok(type).build();
    }

    @GET
    @Path("/{type}")
    public Response getCustomer(@PathParam("type") String type) {
        Customer output = new Customer();
        output.setId(987654);
        output.setName("Willy Wonka");

        return Response.ok(output).build();
    }
}

И, наконец, вот мой пример XML:

<?xml version="1.0" encoding="UTF-8"?>
<Customer>
    <name>Willy Wonka</name>
    <id>987654</id>
</Customer>

Спасибо за любые указатели. Если обзор проще, весь проект упакован на моем сайте github.

J.

1 ответ

Решение

После многих часов царапин на голове я решил это. Проблема заключалась в том, что тело класса не было представлено ни одного сообщения. После того как я добавил streamCache="true" к узлу маршрута в Camel XML, он начал работать.

Вот соответствующая страница на сайте Camel - http://camel.apache.org/stream-caching.html.

Я думаю, что шаблон с использованиемcxfrs:// как из конечной точки делает это неявно. Однако я не смог заставить это работать в Blueprint XML, поэтому я развернул его с помощью Jetty заранее.

J.

Другие вопросы по тегам