Почему аннотация @Provider не работает? (Цель состоит в том, чтобы добавить модуль к синглтону ObjectMapper)
Согласно JavaDocs,
Конструктор по умолчанию, обычно используемый, когда провайдер автоматически настраивается для использования с реализацией JAX-RS.
при вызове JacksonJsonProvider с пустым конструктором,
public JacksonJsonProvider() {
this((ObjectMapper)null, BASIC_ANNOTATIONS);
}
Для ObjectMapper просто установлено значение null. BASIC_ANNOTATIONS, вероятно, содержит @Provider
.
Каким-то образом должна быть возможность настроить ObjectMapper после того, как Blueprint инициализирует классы в памяти.
Итак, у меня есть два варианта:
- ввести что-то в конструктор JacksonJsonProvider, чтобы ObjectMapper имел все зарегистрированные модули при инициализации.
- «разрешить» экземпляр ObjectMapper JacksonJsonProvider и зарегистрировать модули вскоре после инициализации.
Это выглядит как
protected ObjectMapper _locateMapperViaProvider
План
<cxf:rsServer id="cxfConsumer" address="/" serviceClass="com.domain.MyServiceInterface">
<cxf:providers>
<ref component-id="jsonProvider"/>
</cxf:providers>
</cxf:rsServer>
<bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider">
Мой класс @Provider
@Provider
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class JacksonObjectMapperProvider implements ContextResolver<ObjectMapper> {
final ObjectMapper defaultObjectMapper;
public JacksonObjectMapperProvider() {
this.defaultObjectMapper = makeObjectMapper();
}
@Override
public ObjectMapper getContext(Class<?> type) {
return defaultObjectMapper;
}
private static ObjectMapper makeObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new MyObjectSerializerModule());
return mapper;
}
}
Мой сериализатор
public class MyObjectSerializerModule extends SimpleModule {
public MyObjectSerializerModule() {
super("ObjectIdSerializerModule", new Version(1, 0, 0, "alpha"));
this.addSerializer(MyObject.class, new MyObjectSerializer());
}
public class MyObjectSerializer extends JsonSerializer<Location> {
@Override
public void serialize(MyObject value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("id", value.getId());
jsonGenerator.writeEndObject();
}
}
}