2015-10-27 2 views
0

В моем файле конфигурации 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&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); 

Код выше работает! Я могу отправить запрос на получение URl, и я получаю ответ JSON.

Теперь я делаю небольшие изменения: Вместо определения URL веб-службы (и маршрут) с помощью конфигурации XML, я определяю их 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

Фактически отладчик сообщает мне, что определение URI кодом Java распознается, так как я нажимаю код внутри маршрута.

Я видел эту ошибку во многих ответах здесь, в основном они говорят, чтобы добавить поставщика Json и назначить его конечной точке CXF.

Мне кажется, что это то, что я сделал. Но это не работает.

Любая идея, что я делаю неправильно здесь?

+0

Я не использую Camel, поэтому я не понимаю этот материал для создания маршрута, но разница, похоже, в том, что с xml зарегистрирован список провайдеров 'restJacksonProviderList', а с Java - нет. Это «JacksonJsonProvider» - это то, что делает сериализация. Когда это не зарегистрировано, нет serilializer, и вы получите это сообщение об ошибке, не требующее сериализатора (MessageBodyWriter) для обработки преобразования. Как я уже сказал, я понятия не имею о каких-либо конфигурациях, но отсутствие регистрации кажется разницей. –

+0

Непонятно - почему в конце «uriRest» не регистрируются провайдеры в списке «providers = # restJacksonProviderList»? Для этого это и есть. – rapt

ответ

1

Как сказал peeskillet, это потому, что нет списка поставщиков, зарегистрированных под именем restJacksonProviderList. Вы можете получить JndiContext, как это и привязать список к нему в методе конфигурирования вашего routebuilder:

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

Edit после комментариев: Изменения &amp; для & в вашем cxfrs URI определения, &amp; только необходим в XML.

+0

Во-первых, какой контекст в вашем коде? Как вы его получите? Во-вторых, я не понимаю, что вы говорите ... «нет списка провайдеров, зарегистрированных под именем restJacksonProviderList» - нет? есть в XML. Затем в 'from (uriRest)' я говорю Camel, чтобы использовать этих поставщиков для этого маршрута. Непонятно мне, что я имею в XML, который не отображается в Java-коде. Уточнение: в версии Java я храню в XML регистрацию «restJacksonProviderList» и «jacksonJsonProvider». Я только изменяю ** маршрут ** определение из XML в Java DSL. – rapt

+0

А, я вижу, попробуйте заменить & на просто и в конечной точке cxfrs. – fiw

+0

Удивительный! Вот и все. Вы спасли день. Большое спасибо! – rapt

Смежные вопросы