Camel中的REST API - POST无法正常工作(XML解析错误)

时间:2013-04-22 20:56:00

标签: xml cxf apache-camel cxfrs

我尝试创建一个示例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..

我使用通过xjc从XSD构建的类来定义XML。我知道它不是XML有效负载结构的问题,因为当我将GET返回的XML复制到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>

感谢您的任何指示。如果它更容易审核,整个项目就打包在my github site

学家

1 个答案:

答案 0 :(得分:0)

经过几个小时的搔痒,我已经解决了这个问题。问题是没有消息体被呈现给资源类。将streamCache="true"添加到Camel XML中的路由节点后,它开始工作。

以下是Camel网站上的相关页面 - http://camel.apache.org/stream-caching.html

我认为the pattern using cxfrs://作为来自端点的隐式执行此操作。但是,我一直无法在Blueprint XML中使用它,这就是我预先部署Jetty的原因。

学家