Camel & CXF & REST:错误未找到 class java.util.ArrayList 的消息正文作者,ContentType:application/json

Camel & CXF & REST: ERROR No message body writer has been found for class java.util.ArrayList, ContentType: application/json

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

当我点击网络服务 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 端点。

在我看来这就是我所做的。但是没用。

知道我做错了什么吗?

正如 peeskillet 所说,这是因为没有以 restJacksonProviderList 名称注册的提供商列表。您可以像这样获取 JndiContext 并在路由构建器的配置方法中将列表绑定到它:

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

评论后编辑: 在您的 cxfrs uri 定义中将 &amp; 更改为 &&amp; 仅在 xml.

中需要