Не найдено средство записи тела сообщения: JSON: Apache CXF: RestFul Webservices

Я использую 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();
    }
}
}

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


person Sikorski    schedule 13.02.2012    source источник


Ответы (6)


У меня была такая же проблема, и я использую 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>
person mikeland    schedule 20.12.2012
comment
да, были некоторые изменения в пакете после выпуска 2.6 - person Sikorski; 21.12.2012
comment
Это сработало .. Спасибо. Мне также нужно включить зависимость от сброса в maven - person Bhuvan; 28.06.2013

Я нашел это давным-давно, просто разместив его для будущих пользователей. На самом деле apache cxf (2.5.2) не поддерживает необработанные объекты JSON, такие как org.codehaus.jettison.JSONObject. Для использования JSON в запросах и ответах я использовал pojos (просто геттеры и сеттеры с аннотациями JAXB) и поставщик json apache cxf, то есть 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>
person Sikorski    schedule 24.04.2012

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

В 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);

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

person GPrathap    schedule 26.10.2015

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

person Glen Mazza    schedule 13.02.2012
comment
Проблема заключается в том, что всякий раз, когда я выполняю код, я получаю сообщение об отсутствии записи тела для исключения org.codehaus.jettison.json. я не опытный программист, и это мой первый раз с успокоительными услугами. Поддерживает ли cxf объект json так, как я использовал в своем коде? Я использовал трикотажную структуру, он разрешал этот тип кодов без каких-либо ошибок, а также я не упомянул ни одного провайдера в своем web.xml. Обратите внимание, что я бы предпочел не весеннее решение. - person Sikorski; 14.02.2012

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

person Steve J    schedule 16.01.2014

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

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

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

Руководство по переходу на CXF

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

Я просто добавляю необходимые зависимости для вашего файла 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>   

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

person Blamkin86    schedule 28.05.2015
comment
Подробнее здесь: issues.apache.org/jira/browse/CXF-4996 Проблема была исправлена ​​в некоторых версиях CXF. Теперь это работает для меня. - person Blamkin86; 29.05.2015