Registering JacksonJsonProvider with ObjectMapper + JavaTimeModule to Jersey 2 Client
Eventually it works if I use solution that is commented in following snippet.
First of all, you are missing a dependency in your list, that you also have, which is the problem.
jersey-media-json-jackson
This module depends on the native Jackson module that has the JacksonJsonProvider
. When you register the JacksonFeature
(that comes with jersey-media-json-jackson
), it registers its own JacksonJaxbJsonProvider
, which seems to take precedence over any that you provide.
When you use the ContextResolver
, the JacksonJsonProvider
actually looks-up that ContextResolver
and uses it to resolve the ObjectMapper
. That's why it works. Whether you used the JacksonFeature
or registered your own JacksonJsonProvider
(without configuring an ObjectMapper
for it) the ContextResovler
would work.
Another thing about the jersey-media-json-jackson
module, it that it participates in Jersey's auto-discoverable mechanism, which registers it's JacksonFeature
. So even if you didn't explicitly register it, it would still be registered. The only ways to avoid it being registered are to:
- Disable the auto-discovery (as mention in the previous link)
- Don't use the
jersey-media-json-jackson
. Just use the Jackson native modulejackson-jaxrs-json-provider
. Thing about this though is that, thejersey-media-json-jackson
adds a couple features on top of the the native module, so you would lose those. Haven't tested, but it seems that if you use
JacksonJaxbJsonProvider
instead ofJacksonJsonProvider
, it might work. If you look at the source for theJacksonFeature
, you will see that it checks for an already registeredJacksonJaxbJsonProvider
. If there is one, it won't register it's own.The one thing I'm not sure about with this is the auto-discoverable. The order in which it is registered, if it will affect whether or not it catches your registered
JacksonJaxbJsonProvider
. Something you can test out.
From my pet project:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>
public WebTarget getTarget(URI uri) {
Client client = ClientBuilder
.newClient()
.register(JacksonConfig.class);
return client.target(uri);
}
where
@Provider
public class JacksonConfig implements ContextResolver<ObjectMapper> {
private final ObjectMapper objectMapper;
public JacksonConfig() {
objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
@Override
public ObjectMapper getContext(Class<?> aClass) {
return objectMapper;
}
}