【问题标题】:Camel & CXF & REST: ERROR No message body writer has been found for class java.util.ArrayList, ContentType: application/jsonCamel & CXF & REST: 错误没有为类 java.util.ArrayList 找到消息正文编写器,ContentType: application/json
【发布时间】:2015-10-27 20:58:05
【问题描述】:

在我的 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);

上面的代码有效!我可以将 get 请求发送到 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");       
    }   
}

当我点击 Web 服务 URL 时,我收到 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 端点。

在我看来,这就是我所做的。但它不起作用。

知道我在这里做错了什么吗?

【问题讨论】:

  • 我不使用 Camel,所以我不明白这条路线构建的东西,但不同之处似乎在于,使用 xml,注册了提供程序列表restJacksonProviderList,而使用 Java 是不是。 JacksonJsonProvider 是序列化的内容。如果未注册,则没有序列化程序,并且您会收到错误消息,指出没有序列化程序 (MessageBodyWriter) 来处理转换。就像我说的,我不知道任何配置,但缺少注册似乎有所不同
  • 不清楚 - 为什么uriRest 末尾的“providers=#restJacksonProviderList”不注册列表中的提供者?这就是它的用途。

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


【解决方案1】:

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

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

在 cmets 之后编辑: 在 cxfrs uri 定义中将 &amp;amp; 更改为 &amp;amp;&amp;amp; 仅在 xml 中需要。

【讨论】:

  • 首先,您的代码中有哪个上下文?你怎么得到它?其次,我不明白你在说什么......“没有以restJacksonProviderList 名义注册的提供者列表” - 没有? XML中有。然后在from(uriRest) 中,我告诉 Camel 将这些提供程序用于这条路线。我不清楚我在 XML 中有什么没有出现在 Java 代码中。澄清:在 Java 版本中,我在 XML 中保留了“restJacksonProviderList”和“jacksonJsonProvider”bean 的注册。我只是将 route 定义从 XML 更改为 Java DSL。
  • 啊,我明白了,尝试替换 &在您的 cxfrs 端点中只有一个 &。
  • 太棒了!就是这样。你拯救了这一天。非常感谢!
  • 谢谢,我会编辑我的答案以反映实际有什么帮助!
猜你喜欢
  • 2016-08-21
  • 2016-10-01
  • 2018-04-20
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多