В моем файле конфигурации Spring:Camel & CXF & REST: ОШИБКА Ни один писатель тела сообщения не был найден для класса java.util.ArrayList, ContentType: приложения/JSON
<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.
Теперь я делаю небольшие изменения: Вместо определения URL веб-службы (и маршрут) с помощью конфигурации XML, я определяю их 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
Фактически отладчик сообщает мне, что определение URI кодом Java распознается, так как я нажимаю код внутри маршрута.
Я видел эту ошибку во многих ответах здесь, в основном они говорят, чтобы добавить поставщика Json и назначить его конечной точке CXF.
Мне кажется, что это то, что я сделал. Но это не работает.
Любая идея, что я делаю неправильно здесь?
Я не использую Camel, поэтому я не понимаю этот материал для создания маршрута, но разница, похоже, в том, что с xml зарегистрирован список провайдеров 'restJacksonProviderList', а с Java - нет. Это «JacksonJsonProvider» - это то, что делает сериализация. Когда это не зарегистрировано, нет serilializer, и вы получите это сообщение об ошибке, не требующее сериализатора (MessageBodyWriter) для обработки преобразования. Как я уже сказал, я понятия не имею о каких-либо конфигурациях, но отсутствие регистрации кажется разницей. –
Непонятно - почему в конце «uriRest» не регистрируются провайдеры в списке «providers = # restJacksonProviderList»? Для этого это и есть. – rapt