Автор тела сообщения не найден: JSON: Apache CXF: RestFul Webservices - PullRequest
5 голосов
/ 13 февраля 2012

Я использую Apache CXF для создания простого успокаивающего приложения. У меня есть класс клиента, который отправляет объект JSON на сервер, и сервер возвращает обратно JSON после некоторой манипуляции. но когда я выполняю код, я получаю

"org.apache.cxf.interceptor.Fault: .No message body writer has been found for class:           
 class org.codehaus.jettison.json.JSONObject, ContentType : application/json."

Код моего клиента:

public class Client {
public static void main(String[] args) {

    try{

        URI uri =  new URI("http://localhost:8022/RestDemo");

        WebClient client = WebClient.create(uri);

        String ret = client.path("rest").path("server").path("welcome").accept(MediaType.TEXT_PLAIN).get(String.class);

        System.out.println(ret);

        JSONObject json = new JSONObject();
    json.put("name", "ronaldo");
    json = client.path("rest").path("server").path("op").type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON).post(json, JSONObject.class);
    System.out.println(json);
    System.out.println(json.has("reverse")?json.getString("reverse"):"dont have");


    }catch(Exception e){
        System.out.println("e"+e.getLocalizedMessage());
        e.printStackTrace();
    }
}
}

Пожалуйста, помогите.

Ответы [ 6 ]

10 голосов
/ 21 декабря 2012

У меня была такая же проблема, и я использую CXF 2.7.Значение org.apache.cxf.jaxrs.provider.JSONProvider было изменено на org.apache.cxf.jaxrs.provider.json.JSONProvider

. Таким образом, поставщик jaxrs:

<jaxrs:providers>
    <bean class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
        <property name="dropRootElement" value="true" />
        <property name="supportUnwrapped" value="true" />
    </bean>
</jaxrs:providers>
5 голосов
/ 24 апреля 2012

Я нашел это давным-давно, просто опубликовал это для будущих пользователей.На самом деле apache cxf (2.5.2) не поддерживает необработанные объекты JSON, такие как org.codehaus.jettison.JSONObject.Для использования JSON в запросах и ответах я использовал pojos (просто методы получения и установки с аннотациями JAXB) и провайдера apache cxf json, то есть org.apache.cxf.jaxrs.provider.JSONProvider.Ниже приведена моя конфигурация:

<jaxrs:providers>
    <bean class="org.apache.cxf.jaxrs.provider.JSONProvider">
        <property name="dropRootElement" value="true" />
        <property name="supportUnwrapped" value="true" />
    </bean>
</jaxrs:providers>
3 голосов
/ 26 октября 2015

У меня тоже была эта проблема, ни одно из вышеперечисленных решений у меня не сработало.Чтобы решить эту проблему, вам нужно сделать пару вещей, которые я объясню.

В cxf-servlet.xml (конфигурация сервера) должен быть указан один из провайдеров json.

         <jaxrs:server id="categoryRESTService" address="/api">
            <jaxrs:features>
                <cxf:logging/>
            </jaxrs:features>
             <jaxrs:serviceBeans>
                <ref bean="categoryService" />
            </jaxrs:serviceBeans>
             <jaxrs:providers>
                 <ref bean="jsonProvider"/>
             </jaxrs:providers>
          </jaxrs:server> 
          <bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>

В клиенте его можно настроить с помощью Spring или самого исходного кода.Вот как это делается в самом исходном коде.

 WebClient client = WebClient.create("http://localhost:9763/services/api/", Collections.singletonList(new JacksonJsonProvider()))
                .path("categoryservice/category/001").accept(MediaType.APPLICATION_JSON_TYPE);
 Category category = client.get(Category.class);

Итак, здесь у меня есть класс под названием Category, поэтому я сделал это таким образом.Итак, теперь я надеюсь, что вы могли понять, как решить эту ошибку.Еще одна вещь должна сказать об URL.При создании экземпляра WebClient необходимо указать, где развернута служба. И добавить относительный путь к требуемой конечной точке, используя path , как показано в примере кода выше.

0 голосов
/ 28 мая 2015

Для меня эта проблема возникла в результате перехода на Jackson 2.x.и все еще хотел использовать CXF с JaxRS.

Приведенные выше предложения от MikeLand и Sikorski сработали для меня.

Руководство по миграции фактически обсуждает это

Руководство по миграции CXF

Прокрутите вниз до «Изменения зависимостей».

I'mпросто добавьте необходимые зависимости для вашего файла Maven pom.xml:

    <!--  for JSON provider -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-extension-providers</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <!--  for extension providers -->
    <dependency>
        <groupId>org.codehaus.jettison</groupId>
        <artifactId>jettison</artifactId>
        <version>1.2</version>
    </dependency>   

Это одна из тех сделок, которые заняли больше времени, чем нужно было решить.Надеюсь, это кому-нибудь поможет.

0 голосов
/ 16 января 2014

Другой подход: я обнаружил, что, когда я изменил заголовок моего запроса «Принять» с «application / json» на « / », я больше не получал сообщение об ошибке «Не найден автор тела сообщения».

0 голосов
/ 13 февраля 2012

Из ваших писем я не уверен, генерируется ли ошибка клиентом или службой REST.Кроме того, ваш REST-сервис когда-либо успешно возвращает JSON (и это просто клиент с проблемой) или он всегда дает сбой (что указывает на проблему с сервисом)?Если проблема заключается в сервисе, укажите пункт 10 здесь: http://www.jroller.com/gmazza/entry/jersey_samples_on_cxf отмечает, что вам нужно добавить провайдера JSON и зависимость, как показано, иначе он не будет знать, как обрабатывать JSON.Это может быть проблемой.

...