Question

Est-il possible d'utiliser Jackson comme sérialiseur / placier pour les données JSON au lieu de JAXB lors de l'utilisation de Jersey API client?

Si oui, comment le configurer?

Était-ce utile?

La solution

OK, je l'ai trouvé dehors, il se révèle être assez simple, après tout:

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

Le JacksonJsonProvider provient du paquet jackson-jaxrs.

Autres conseils

Vous pouvez sauter la création de configuration externe et enregistrer le fournisseur directement:

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

Solution avec JacksonJaxbJsonProvider

façon commune comment utiliser Jackson avec une configuration personnalisée dans le client Jersey était d'utiliser JacksonJaxbJsonProvider par exemple comme ceci

JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
provider.setMapper(yourObjectMapper());
Client client = ClientBuilder.newClient(new ClientConfig(provider));

Malheureusement Jersey 2,26 ils ont copié classe JacksonJaxbJsonProvider de artefact com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider (Jackson) à org.glassfish.jersey.media:jersey-media-json-jackson artefact (Jersey) et package modifié de com.fasterxml.jackson.jaxrs.json à org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.

Il est toujours possible d'utiliser cette approche, il est juste nécessaire de changer l'importation JacksonJaxbJsonProvider.

En dehors de JacksonJaxbJsonProvider étant maintenant inconvénient paquet internal est également que vous devez savoir sur quelle version Jersey votre code court qui pourrait être un problème lorsque différentes dépendances nécessitent différentes versions de Jersey.

Une meilleure solution avec ContextResolver<ObjectMapper>

Une meilleure possibilité comment configurer Jackson à Jersey client est d'utiliser de la même manière comment il est configuré à Jersey serveur qui est de créer fournisseur de ObjectMapper comme ceci:

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {

    private ObjectMapper objectMapper = yourObjectMapper();

    @Override
    public ObjectMapper getContext(Class<?> objectType) {
        return objectMapper;
    }

}

et de l'utiliser par exemple comme ceci:

ClientConfig clientConfig = new ClientConfig();
clientConfig.register(JacksonFeature.class);  // usually auto-discovered
clientConfig.register(new ObjectMapperProvider());
Client client = ClientBuilder.newClient(clientConfig);

Si vous avez à la fois le serveur et le client, vous pouvez réutiliser la classe ObjectMapperProvider.

Il semble que cette approche fonctionne de la version 2.9 Jersey.

Vous pouvez également essayer org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider (jackson-jaxrs 1.6.1).

Je suis tombé sur la même question, mais pour moi aucune des suggestions données travaillé ici. Ce qui a fonctionné pour moi était en dessous de morceau de 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();

Le principal changement est l'utilisation de JacksonFeature.class - il vient de jersey-media-json-jackson-x.yy.jar

Je suis la moindre idée d'utiliser cette solution de cet article - http: // www. baeldung.com/jersey-jax-rs-client

Pour jersey 2.22.2 et Jackson 2.7.2 dépendances Gradle sont:

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

code client de l'échantillon est la suivante:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top