2012-02-13 12 views
5

Estoy usando Apache CXF para hacer una aplicación sencilla y relajante. Tengo una clase de cliente que publica un objeto JSON en el servidor y el servidor devuelve un JSON después de alguna manipulación. pero cuando ejecuto el código me saleNo se encontró ningún escritor de cuerpo del mensaje: JSON: Apache CXF: RestFul Webservices

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

Mi código de cliente:

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(); 
    } 
} 
} 

por favor ayuda.

Respuesta

4

Lo encontré hace mucho tiempo atrás, solo lo publiqué para futuros usuarios. En realidad, apache cxf (2.5.2) no admite objetos JSON sin formato como org.codehaus.jettison.JSONObject. Para usar JSON en solicitudes y respuestas, utilicé pojos (simplemente getters y setters con anotaciones JAXB) y apache cxf json provider, es decir, org.apache.cxf.jaxrs.provider.JSONProvider. La siguiente es mi configuración:

<jaxrs:providers> 
    <bean class="org.apache.cxf.jaxrs.provider.JSONProvider"> 
     <property name="dropRootElement" value="true" /> 
     <property name="supportUnwrapped" value="true" /> 
    </bean> 
</jaxrs:providers> 
0

No estoy seguro de su escritura si el error está siendo generado por el cliente o por el servicio REST. Además, ¿su servicio REST alguna vez devuelve JSON exitosamente (y es solo este cliente con el problema) o siempre está fallando (lo que indica que el problema es con el servicio)? Si el problema es el servicio, apunte aquí al n. ° 10: http://www.jroller.com/gmazza/entry/jersey_samples_on_cxf notas que deberá agregar en un proveedor JSON y la dependencia como se muestra, de lo contrario no sabrá cómo procesar JSON. Ese podría ser el problema.

+0

El problema es que cada vez que ejecuto el código me sale la excepción "No message body writer for org.codehaus.jettison.json". No soy un programador experto y esta es la primera vez que tengo servicios tranquilos. ¿Cxf admite el objeto json de una manera que he usado en mi código? He usado el framework de jersey que permite este tipo de códigos sin ningún error y tampoco mencioné ningún proveedor en mi web.xml. Tenga en cuenta que preferiría una solución que no sea de primavera. – Sikorski

9

Tuve el mismo problema y estoy usando CXF 2.7. El org.apache.cxf.jaxrs.provider.JSONProvider se ha cambiado a org.apache.cxf.jaxrs.provider.json.JSONProvider

Así el proveedor jaxrs es:

<jaxrs:providers> 
    <bean class="org.apache.cxf.jaxrs.provider.json.JSONProvider"> 
     <property name="dropRootElement" value="true" /> 
     <property name="supportUnwrapped" value="true" /> 
    </bean> 
</jaxrs:providers> 
+0

sí hubo algunos cambios en el paquete después de la versión 2.6 – Sikorski

+0

Esto funcionó .. Gracias. También necesito incluir la dependencia de Jettison en maven – Bhuvan

0

Un enfoque diferente: He descubierto que cuando he cambiado de "Aceptar" encabezado de la solicitud de "application/json" a "/ "luego ya no recibí el mensaje de error" No se encontró el escritor del cuerpo del mensaje ".

0

Para mí, este problema surgió como resultado de la conversión a Jackson 2.x. y aún querer usar CXF con JaxRS.

Las sugerencias anteriores de MikeLand y Sikorski funcionaron para mí.

La guía de migración en realidad trata este

CXF Migration Guide

vaya a "Dependencia cambios".

sólo estoy añadiendo las dependencias necesarias para su pom.xml Maven:

<!-- 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> 

Ésta es una de esas ofertas que tuvieron camino más largo de lo que debía resolver. Espero que esto ayude a alguien.

+0

Más detalles aquí: https://issues.apache.org/jira/browse/CXF-4996 El problema fue reparado en ciertas versiones de CXF. Esto ahora está funcionando para mí. – Blamkin86

3

También tuve este problema, ninguna de las soluciones anteriores no funcionó para mí. Para resolver este problema, debe hacer un par de cosas que explicaré.

En cxf-servlet.xml (configuración del servidor) se debe proporcionar uno de los proveedores 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"/> 

En el cliente, se puede configurar utilizando el código fuente o el código fuente. Aquí está cómo se hace en el código fuente en sí.

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

Así que aquí tienen una clase llamada Categoría, es por eso que he hecho de esa manera. Así que ahora espero que puedan entender cómo resolver este error. Una cosa más necesita decir acerca de las URL. Cuando crea una instancia de WebClient , debe indicar dónde se implementa el servicio. Y agregue una ruta relativa al punto final deseado utilizando la ruta , como se muestra arriba, en el código de ejemplo.

Cuestiones relacionadas