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&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");
}
}
当我点击网络服务 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 定义中将 &
更改为 &
,&
仅在 xml.
中需要
在我的 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");
}
}
当我点击网络服务 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 定义中将 &
更改为 &
,&
仅在 xml.