Я пытаюсь создать образец маршрута 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.
public Response newCustomer(@PathParam("type") String type, @QueryParam("active") @DefaultValue("true") boolean active)
. Что, кажется, указывает мне на ошибку синтаксического анализа. - person Jeremy Gooch   schedule 23.04.2013