Можно ли настроить Джерси с помощью Джексона для сериализации/десериализации с использованием нескольких настроенных ObjectMappers
?
Что я хотел бы сделать, так это зарегистрировать Джексона «по умолчанию» ObjectMapper
, а затем иметь возможность зарегистрировать другую функцию, которая предоставляет ObjectMapper
с некоторой специализированной конфигурацией, которая при определенных обстоятельствах «отменит» «по умолчанию» ObjectMapper
.
Например, это ContextResolver
будет для картографа «по умолчанию»:
@Provider
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class JacksonMapperProvider implements ContextResolver<ObjectMapper> {
private final ObjectMapper mObjectMapper;
public JacksonMapperProvider() {
mObjectMapper = createMapper();
}
protected abstract ObjectMapper createMapper() {
ObjectMapper mapper = createMapper();
return mapper
.setSerializationInclusion(Include.ALWAYS)
.configure(JsonParser.Feature.ALLOW_COMMENTS, true)
.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true)
.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true)
.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mObjectMapper;
}
}
И этот ContextResolver
должен был переопределить маппер «по умолчанию»:
@Provider
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class SpecializedMapperProvider implements ContextResolver<ObjectMapper> {
private final ObjectMapper mObjectMapper;
public SpecializedMapperProvider() {
mObjectMapper = createMapper();
}
protected abstract ObjectMapper createMapper() {
ObjectMapper mapper = createMapper();
return mapper
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"))
.registerModule(new SpecializedModule1())
.registerModule(new SpecializedModule2());
}
@Override
public ObjectMapper getContext(Class<?> type) {
if(SomeType.isAssignableFrom(type)) {
return mObjectMapper;
}
return null;
}
}
Я вижу в коде JacksonJsonProvider
, что Джексон поддерживает внедрение/разрешение провайдера ObjectMapper
. Однако на практике я вижу, что «порядок» поставщиков кажется случайным (я предполагаю, что это не так, но я не могу разобраться, как контролировать порядок). Иногда «переопределение» предшествует «по умолчанию» и все работает, но при следующем запуске сервера порядок меняется.
Я пытался заставить это работать несколькими способами, включая:
- Регистрация
ContextResolver<ObjectMapper>
реализаций вручную (в разном порядке) - Регистрация реализаций
ContextResolver<ObjectMapper>
с помощью аннотаций@Provider
- Указание приоритета при регистрации
Я использую следующее:
- Джерси 2.8
- Джексон 2.3.3
Возможно, я использую совершенно неверный подход?
Есть ли лучший способ добиться того, что я пытаюсь сделать? Может быть, мне следует просто определить два отдельных приложения JAX-RS и создать для каждого из них единую конфигурацию ObjectMapper?
ObjectMapper defaultMapper = return new ObjectMapper()
, это не то же самое, что экземплярJacksonJsonProvider
по умолчанию. По крайней мере, не дляJacksonJaxbJsonProvider
. - person ulab   schedule 11.04.2016