Mit Jackson als Jersey-Client Serializer
Frage
Ist es möglich, anstelle von JAXB Jackson als Serializer / Einweiser für JSON-Daten zu verwenden, wenn Jersey-Client-API verwenden?
Wenn ja, wie es zu konfigurieren?
Lösung
OK, fand ich es heraus, es stellt sich heraus, ganz einfach zu sein, nachdem alle:
ClientConfig cc = new DefaultClientConfig();
cc.getClasses().add(JacksonJsonProvider.class);
Client clientWithJacksonSerializer = Client.create(cc);
Die JacksonJsonProvider stammt aus dem Jackson-jaxrs Paket.
Andere Tipps
Sie können die Erstellung von externen Konfigurations überspringen und die Anbieter registrieren direkt:
Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class)
Lösung mit JacksonJaxbJsonProvider
Gemeinsame Art und Weise, wie Jackson in Jersey-Client mit benutzerdefinierter Konfiguration zu verwenden, war JacksonJaxbJsonProvider
zum Beispiel wie diese
JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
provider.setMapper(yourObjectMapper());
Client client = ClientBuilder.newClient(new ClientConfig(provider));
Leider gibt es in Jersey 2,26 sie kopiert JacksonJaxbJsonProvider
Klasse
von com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider
Artefakt (Jackson)
zu org.glassfish.jersey.media:jersey-media-json-jackson
Artefakt (Jersey)
und geänderte Paket
von com.fasterxml.jackson.jaxrs.json
zu org.glassfish.jersey.jackson.internal.jackson.jaxrs.json
.
Es ist immer noch möglich, diesen Ansatz zu verwenden, um es zu ändern JacksonJaxbJsonProvider
Import gerade gebraucht wird.
Neben JacksonJaxbJsonProvider
jetzt in internal
Paket Nachteil zu sein, ist auch
dass Sie wissen müssen, auf dem Jersey-Version Ihres Code ausgeführt wird, die ein Problem sein könnte, wenn verschiedene Abhängigkeiten verschiedene Jersey Versionen benötigen.
Bessere Lösung mit ContextResolver<ObjectMapper>
Bessere Möglichkeit, wie Jackson in Jersey konfigurieren Client ist die gleiche Art und Weise zu verwenden, wie es in Jersey konfiguriert ist Server , die ObjectMapper
Anbieter wie diese zu erstellen ist:
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
private ObjectMapper objectMapper = yourObjectMapper();
@Override
public ObjectMapper getContext(Class<?> objectType) {
return objectMapper;
}
}
und verwenden Sie es zum Beispiel wie folgt aus:
ClientConfig clientConfig = new ClientConfig();
clientConfig.register(JacksonFeature.class); // usually auto-discovered
clientConfig.register(new ObjectMapperProvider());
Client client = ClientBuilder.newClient(clientConfig);
Wenn Sie beide haben den Server und der Client können Sie ObjectMapperProvider
Klasse wiederverwenden.
Es scheint, dass dieser Ansatz funktioniert aus Jersey-Version 2.9.
Sie möchten vielleicht auch org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider (jackson-jaxrs 1.6.1)
versuchen.
Ich lief in ähnliches Problem, aber für mich keine der hier gearbeitet gegebenen Vorschläge. Was für mich gearbeitet wurde unter Stück Code:
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Client;
...
ClientBuilder clientBuilder = ClientBuilder.newBuilder()
clientBuilder.register(JacksonFeature.class);
...
Client client = clientBuilder.build();
Die Schlüsseländerung war Nutzung von JacksonFeature.class
- es kommt von jersey-media-json-jackson-x.yy.jar
Ich habe Ahnung, diese Lösung aus diesem Artikel verwenden - http: // www. baeldung.com/jersey-jax-rs-client
Für Jersey 2.22.2 und Jackson 2.7.2 gradle Abhängigkeiten sind:
dependencies {
compile("com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.7.2")
compile("org.glassfish.jersey.core:jersey-client:2.22.2")
}
Beispiel Client-Code ist:
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