骆驼& CXF& REST:错误没有为类java.util.ArrayList找到消息正文编写器,ContentType:application / json

时间:2015-10-27 20:58:06

标签: spring jackson apache-camel jax-rs cxf

在我的Spring配置文件中:

<bean id="jacksonJsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />

<bean id="restJacksonProviderList" class="java.util.ArrayList">
    <constructor-arg>
        <list>
            <ref bean="jacksonJsonProvider"/>
        </list>
    </constructor-arg>
</bean>

//......

<route id="RestMyRoute">
    <from id="RestRequest"  uri="cxfrs:/rest/MyService?resourceClasses=com.myself.services.MyService&amp;bindingStyle=SimpleConsumer&amp;providers=#restJacksonProviderList" />
    <to     uri="direct:doRoute" />
</route>

服务界面:

@GET
@Path("/my/something/{id}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@WebMethod
@WebResult(name = "getSomethingResponse")
public List<MySomething> getSomething(
    @PathParam("id") @WebParam(name = "id") String id);

上面的代码有效!我可以将获取请求发送到URl,并获得JSON响应。

现在,我做了一个小改动:我没有通过XML配置定义Web服务的URL(和路由),而是通过Java代码定义它们:

public class MyRoute extends RouteBuilder {

    private String uriRest = "cxfrs:/rest/MyService?resourceClasses=com.myself.services.MyService&amp;bindingStyle=SimpleConsumer&amp;providers=#restJacksonProviderList";

    @Override
    public void configure() throws Exception {

        from(uriRest).
        to("log:input").
        to("direct:doRoute").
        to("log:output");       
    }   
}

当我点击网络服务网址时,我收到500 Internal Server Error并在日志(Tomcat)中看到JAXRSUtils ERROR No message body writer has been found for class java.util.ArrayList, ContentType: application/json

实际上调试器告诉我,通过Java代码定义URI是可以识别的,因为我确实点击了路由中的代码。

我在这里看到了许多答案中的这个错误,基本上他们说要添加一个Json提供程序并将其分配给CXF端点。

在我看来,就像我所做的那样。但它不起作用。

知道我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

正如peeskillet所说,这是因为没有以restJacksonProviderList名称注册的提供者列表。您可以像这样获取JndiContext并在routebuilder的configure方法中将列表绑定到它:

JndiContext registry = (JndiRegistry) context.getRegistry();
registry.bind("restJacksonProviderList", Arrays.asList(new JacksonJsonProvider()));

评论后编辑: 在cxfrs uri定义中更改&amp;的{​​{1}},只需要在xml中使用&