Spring 骆驼及;CXF&;REST:ERROR未找到类java.util.ArrayList的消息体编写器,ContentType:application/json

Spring 骆驼及;CXF&;REST:ERROR未找到类java.util.ArrayList的消息体编写器,ContentType:application/json,spring,jackson,apache-camel,jax-rs,cxf,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

在我的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>
当我点击web服务URL时,我得到的是
500内部服务器错误
,在日志(Tomcat)中我看到
JAXRSUtils错误没有找到java.util.ArrayList类的消息体编写器,ContentType:application/json

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

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

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


知道我做错了什么吗?

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

JndiContext registry = (JndiRegistry) context.getRegistry();
registry.bind("restJacksonProviderList", Arrays.asList(new JacksonJsonProvider()));
评论后编辑:
更改
&用于cxfrs uri定义中的
&
&只在xml中需要。

我不使用Camel,所以我不理解这个路由构建的东西,但区别似乎在于xml中的提供者列表
restJacksonProviderList
是注册的,而Java中则不是。这就是序列化的作用。如果未注册,则没有serializer,并且您会收到错误消息,表示没有序列化程序(MessageBodyWriter)来处理转换。正如我所说,我不知道任何配置,但缺少注册似乎有所不同。不清楚-为什么
uriRest
末尾的“providers=#restJacksonProviderList”不在列表中注册提供程序?这就是它的目的。首先,您的代码中有哪些上下文?你是怎么得到的?第二,我不明白你在说什么。。。“没有以restJacksonProviderList名称注册的提供商列表”-没有吗?XML中有一个新的属性。然后在
from(uriRest)
中,我告诉Camel将这些提供者用于此路由。我不清楚XML中哪些内容没有出现在Java代码中。澄清:在Java版本中,我在XML中保留了“restJacksonProviderList”和“jacksonJsonProvider”bean的注册。我只将路由定义从XML更改为JavaDSL;在您的cxfrs端点中只有一个(&S)。太棒了!就这样。你挽救了这一天。非常感谢!谢谢,我将编辑我的答案,以反映实际的帮助!
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");       
    }   
}
JndiContext registry = (JndiRegistry) context.getRegistry();
registry.bind("restJacksonProviderList", Arrays.asList(new JacksonJsonProvider()));