diff --git a/src/main/java/com/inteligr8/rs/Client.java b/src/main/java/com/inteligr8/rs/Client.java index cda7b3a..1700d99 100644 --- a/src/main/java/com/inteligr8/rs/Client.java +++ b/src/main/java/com/inteligr8/rs/Client.java @@ -22,7 +22,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; -import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; /** * A class that provides pre-configured JAX-RS Client & WebTarget objects. @@ -70,9 +69,14 @@ public abstract class Client { public final javax.ws.rs.client.Client buildClient(AuthorizationFilter authFilter) { ObjectMapper om = new ObjectMapper(); om.registerModules(new JavaTimeModule()); + this.getConfig().configureJacksonMapper(om); - JacksonJsonProvider provider = new JacksonJaxbJsonProvider(om, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS); - + JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider(om, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS); + provider.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL); + provider.disable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE); + + this.getConfig().configureJacksonProvider(provider); + if (this.getConfig().isWrapRootValueEnabled()) provider.enable(SerializationFeature.WRAP_ROOT_VALUE); if (this.getConfig().isUnwrapRootValueEnabled()) @@ -88,15 +92,17 @@ public abstract class Client { clientBuilder.register(authFilter); this.buildClient(clientBuilder); + this.getConfig().configureClient(clientBuilder); + return clientBuilder.build(); } - - /** - * @param clientBuilder A client builder - */ - public void buildClient(ClientBuilder clientBuilder) { - // for extension purposes - } + + /** + * @param clientBuilder A client builder + */ + public void buildClient(ClientBuilder clientBuilder) { + // for extension purposes + } /** * @return A pre-configured JAX-RS target (client w/ base URL) with configured authorization. diff --git a/src/main/java/com/inteligr8/rs/ClientConfiguration.java b/src/main/java/com/inteligr8/rs/ClientConfiguration.java index 1bc48fe..48834b0 100644 --- a/src/main/java/com/inteligr8/rs/ClientConfiguration.java +++ b/src/main/java/com/inteligr8/rs/ClientConfiguration.java @@ -16,6 +16,11 @@ package com.inteligr8.rs; import java.net.URI; +import javax.ws.rs.client.ClientBuilder; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; + /** * This interface defines the configurable parameters of the clients; primarily * their default authentication and authorization. @@ -128,6 +133,18 @@ public interface ClientConfiguration { default boolean isWrapRootValueEnabled() { return false; } + + /** + * @param mapper A Jackson object mapper to configure. + */ + default void configureJacksonMapper(ObjectMapper mapper) { + } + + /** + * @param provider A Jackson JAX-RS provider to configure. + */ + default void configureJacksonProvider(JacksonJaxbJsonProvider provider) { + } @@ -169,5 +186,13 @@ public interface ClientConfiguration { return null; } } + + /** + * A Jackson provider, logging filter, and authentication filter are already registered. + * + * @param clientBuilder A JAX-RS client builder to configure. + */ + default void configureClient(ClientBuilder clientBuilder) { + } }