2012-02-13 13 views
5

Sto utilizzando Apache CXF per creare un'applicazione semplice e riposante. Ho una classe client che pubblica un oggetto JSON sul server e il server restituisce un JSON dopo alcune manipolazioni. ma quando eseguo il codice ottengoNon è stato trovato alcun writer del corpo del messaggio: 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." 

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

prega di aiuto.

risposta

4

L'avevo trovato molto tempo fa, solo pubblicandolo per i futuri utenti. In realtà apache cxf (2.5.2) non supporta oggetti JSON non elaborati come org.codehaus.jettison.JSONObject. Per usare JSON in richieste e risposte, ho usato pojos (semplicemente getter e setter con annotazioni JAXB) e apache cxf json provider i.e. org.apache.cxf.jaxrs.provider.JSONProvider. Di seguito è la mia configurazione:

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

Non sono sicuro dalla tua scrittura se l'errore viene generato dal client o dal servizio REST. Inoltre, il servizio REST restituisce mai correttamente JSON (ed è proprio questo client con il problema) o è sempre in errore (indicando che il problema è relativo al servizio)? Se il problema è il servizio, qui il punto 10: http://www.jroller.com/gmazza/entry/jersey_samples_on_cxf note che dovrai aggiungere in un provider JSON e dipendenze come mostrato, altrimenti non saprà come elaborare JSON. Questo potrebbe essere il problema.

+0

Il problema è che ogni volta che eseguo il codice ottengo l'eccezione "No body writer per org.codehaus.jettison.json". Non sono un programmatore esperto e questa è la mia prima volta con servizi rilassanti. Cxf supporta l'oggetto json in un modo che ho usato nel mio codice? Ho usato jersey framework che ha permesso questo tipo di codici senza errori e inoltre non ho menzionato alcun provider nel mio web.xml. Si prega di notare che preferirei una soluzione non primavera. – Sikorski

9

Ho avuto lo stesso problema e sto usando CXF 2.7. Il org.apache.cxf.jaxrs.provider.JSONProvider è stato modificato per org.apache.cxf.jaxrs.provider.json.JSONProvider

Quindi il provider 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> 
+0

sì ci sono stati alcuni cambiamenti di pacchetto dopo 2.6 release – Sikorski

+0

Questo ha funzionato .. Grazie. Devo includere anche la dipendenza da jettison in maven – Bhuvan

0

Un approccio diverso: ho scoperto che quando ho cambiato il mio "Accetta" intestazione di richiesta da "application/json" a "/ "quindi non ho più ricevuto il messaggio di errore" Impossibile trovare il corpo del messaggio trovato ".

0

Per me, questo problema si è verificato a seguito della conversione in Jackson 2.x. e ancora voglia di usare CXF con JaxRS.

I suggerimenti sopra riportati di MikeLand e Sikorski hanno funzionato per me.

La guida migrazione effettivamente discute questo

CXF Migration Guide

scorrere fino a "dipendenza modifiche".

che sto semplicemente aggiungendo le dipendenze richieste per il file 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> 

Questa è una di quelle occasioni che hanno avuto modo più di quanto avrebbe dovuto risolvere. Speriamo che questo possa aiutare qualcuno.

+0

Ulteriori dettagli qui: https://issues.apache.org/jira/browse/CXF-4996 Il problema è stato riparato in alcune versioni di CXF. Questo ora sta funzionando per me. – Blamkin86

3

Ho anche avuto questo problema, nessuna delle soluzioni di cui sopra non ha funzionato per me. Per risolvere questo problema, devi fare un paio di cose che spiegherò.

In cxf-servlet.xml (configurazione server) deve essere fornito uno dei provider 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"/> 

Nel client, esso può essere configurato usando molla o sorgente codice stesso. Ecco come avviene nel codice sorgente stesso.

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

Così qui ho una classe denominata Categoria, è per questo che ho fatto in quel modo. Quindi ora spero che tu possa capire come risolvere questo errore. Un'altra cosa da dire sugli URL. Quando si crea un'istanza di WebClient è necessario indicare dove viene distribuito il servizio. Aggiungere un percorso relativo all'endpoint desiderato utilizzando il percorso come mostrato sopra codice di esempio.

Problemi correlati