在我的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);
上面的代码有效!我可以将获取请求发送到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");
}
}
当我点击网络服务网址时,我收到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端点。
在我看来,就像我所做的那样。但它不起作用。
知道我在这里做错了吗?
答案 0 :(得分:1)
正如peeskillet所说,这是因为没有以restJacksonProviderList名称注册的提供者列表。您可以像这样获取JndiContext并在routebuilder的configure方法中将列表绑定到它:
JndiContext registry = (JndiRegistry) context.getRegistry();
registry.bind("restJacksonProviderList", Arrays.asList(new JacksonJsonProvider()));
评论后编辑:
在cxfrs uri定义中更改&
的{{1}},只需要在xml中使用&
。