【发布时间】: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&bindingStyle=SimpleConsumer&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&bindingStyle=SimpleConsumer&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