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?

War es hilfreich?

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

zu verwenden,
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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top