2015-05-08 32 views
6

Ho un client JAX-RS che sta facendo una semplice richiesta GET. Sto usando l'implementazione CXF e Spring per DI. La chiamata ha successo e ricevo un codice di risposta di 200 indietro. Ma sto ricevendo un errore durante la lettura della risposta nel mio POJO.Come registrare il fornitore di jackson json per il client cxf jax-rs 2.0?

Eccezione:

[2015-05-08 16:11:55,457][ERROR][org.apache.cxf.jaxrs.utils.JAXRSUtils]: No message body reader has been found for class com.voya.refapp.domain.Customer, ContentType: application/json 
[2015-05-08 16:11:55,468][ERROR][com.voya.refapp.service.CustomerServiceImpl]: filterByName() - Exception occurred 
javax.ws.rs.client.ResponseProcessingException: No message body reader has been found for class com.voya.refapp.domain.Customer, ContentType: application/json 
    at org.apache.cxf.jaxrs.impl.ResponseImpl.reportMessageHandlerProblem(ResponseImpl.java:433) ~[cxf-rt-frontend-jaxrs-3.0.4.jar:3.0.4] 
    at org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.java:384) ~[cxf-rt-frontend-jaxrs-3.0.4.jar:3.0.4] 

Codice:

Client client = ClientBuilder.newClient(); 
WebTarget target = client.target("http://localhost:8080/rest").path("customers/1"); 
Invocation.Builder builder = target.request(MediaType.APPLICATION_JSON_TYPE); 
Response response = builder.get(); // Successful 
Customer customer = response.readEntity(Customer.class); // Fails 

ho la dipendenza di seguito come suggerito in this answer nel mio percorso di classe, non sembra essere scelto automaticamente.

<dependency> 
     <groupId>com.fasterxml.jackson.jaxrs</groupId> 
     <artifactId>jackson-jaxrs-json-provider</artifactId> 
    </dependency> 

Ho provato anche la registrazione del provider di JSON durante la creazione del client:

Client client = ClientBuilder.newClient().register(new JacsksonJsonProvider()); 

e

Client client = ClientBuilder.newClient().register(JacsksonJsonProvider.class); 

Ma nessuna di queste opzioni ha lavorato troppo. Ho ottenuto un'eccezione diverso quando ho registrato il provider JSON utilizzando una delle opzioni di cui sopra:

javax.ws.rs.client.ResponseProcessingException: Problem with reading the data 

Aggiornamento:

Registrazione del fornitore JSON ha funzionato bene con ClientBuilder.newClient().register(JacsksonJsonProvider.class). Il problema era con i dati (come l'eccezione sopra chiaramente afferma .. Mi sento sciocco ora :(). Ho avuto campo booleano nel json denominato "attivo", ma è stato chiamato "isActive" nel POJO. Una volta ho aggiunto il l'annotazione @JsonProperty("active") al campo in POJO, ha iniziato a lavorare bene

risposta

7

AFAIK CXF fa not support autodiscovery di MessageBodyReader classi. Ma la registrazione manualmente JacksonJsonProvider dovrebbe funzionare per voi.

si prega di verificare my example che funziona perfettamente. E 'quasi esattamente la Come il tuo, ho appena usato un servizio diverso, forse puoi individuare una differenza che impedisce alla tua versione di funzionare correttamente.

Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class); 
WebTarget target = client.target("http://jsonplaceholder.typicode.com").path("posts/1"); 
Invocation.Builder builder = target.request(MediaType.APPLICATION_JSON_TYPE); 
Response response = builder.get(); // Successful 
Post post = response.readEntity(Post.class); 
+1

Grazie per la risposta, Dawid. Come hai detto tu, avevo lo stesso codice del tuo, ma il problema era a causa del campo booleano in the json. È stato chiamato "attivo" in JSON, ma "isActive" nel POJO. Una volta aggiunto '@JsonProperty (" active ")' al campo in POJO, ha iniziato a funzionare correttamente. –