2010-03-21 13 views
34

Czy można używać Jackson jako serializatora/koordynatora dla danych JSON zamiast JAXB podczas korzystania z interfejsu API klienta Jersey?Używanie serializatora klientów Jackson as Jersey

Jeśli tak, jak to skonfigurować?

+0

Ciekawe pytanie: jeszcze nie korzystałem z API klienta (jeszcze). Czy zapytałeś o to na liście (y) Jersey? Z pewnością powinno być możliwe podłączenie czytników/programów piszących, a wtyczka Jackson jax-rs implementuje te interfejsy. – StaxMan

+0

StaxMan, Jersey Client API nie jest częścią specyfikacji JAX-RS. Ale twoje prawo, powinienem najpierw spróbować zapytać na liście mailowej w Jersey. –

Odpowiedz

54

OK, znalazłem go, okazuje się być całkiem proste mimo wszystko:

ClientConfig cc = new DefaultClientConfig(); 
cc.getClasses().add(JacksonJsonProvider.class); 
Client clientWithJacksonSerializer = Client.create(cc); 

JacksonJsonProvider pochodzi z pakietu Jackson-jaxrs.

+1

Fajnie, dobrze to wiedzieć. – StaxMan

+1

Proszę oznaczyć to jako odpowiedź na pytanie. – GuiSim

+0

Zobacz także odpowiedź swista poniżej, co jest jeszcze prostsze. – ocroquette

4

Możesz także chcieć wypróbować org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider (jackson-jaxrs 1.6.1).

+0

Czy mógłbyś wytłumaczyć dlaczego? –

+0

@ landon9720, ponieważ obsługuje adnotacje JAXB, a także domyślne adnotacje Jacksona. – Gijs

16

można pominąć tworzenie zewnętrznych config i zarejestrować się z dostawcą bezpośrednio:

Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class) 
+0

Szukałem rozwiązania tego problemu znacznie dłużej, niż się przyznam, to działało !! – Brooks

0

Na koszulce 2.22.2 i Jackson 2.7.2 Gradle zależności są:

dependencies { 
    compile("com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.7.2") 
    compile("org.glassfish.jersey.core:jersey-client:2.22.2") 
} 

Przykładowy kod klienta to:

final String name = "world"; 
final Client client = ClientBuilder.newClient().register(JacksonJaxbJsonProvider.class); 
final WebTarget target = client.target("http://localhost:8080").path("hello").path(name); 
final Message message = target.request().get(Message.class); 

System.out.println(message.getWelcomeMessage()); // hello world 
0

Wpadłem na podobny problem, ale dla mnie żadna z podanych tutaj sugestii nie zadziałała. Co pracował dla mnie było poniżej fragment kodu:

import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.client.Client; 
... 

ClientBuilder clientBuilder = ClientBuilder.newBuilder() 
clientBuilder.register(JacksonFeature.class); 
... 
Client client = clientBuilder.build(); 

Kluczową zmianą było użycie JacksonFeature.class - pochodzi od jersey-media-json-jackson-x.yy.jar

dostałam wskazówkę do korzystania z tego rozwiązania z tego artykułu - http://www.baeldung.com/jersey-jax-rs-client