Кажется, я не смог правильно зарегистрировать модуль модуля Jackson ObjectMapper.
Я использую стек Guice + Jersey + Jackson (FasterXML).
Я следил за тем, как настроить ObjectMapper на основе различных вопросов здесь. В частности, у меня есть объявленный ContextResolver, помеченный как @javax.ws.rs.ext.Provider и @javax.inject.Singleton.
У меня есть GuiceServletContextListener по строкам:
@Override
protected Injector getInjector() {
Injector injector = Guice.createInjector(new DBModule(dataSource),
new ServletModule()
{
@Override
protected void configureServlets() {
// Mapper
bind(JacksonOMP.class).asEagerSingleton();
// ...
Map<String, String> initParams = new HashMap<String, String>();
initParams.put("com.sun.jersey.config.feature.Trace",
"true");
initParams.put("com.sun.jersey.api.json.POJOMappingFeature", "true");
serve("/services/*").with(
GuiceContainer.class,
initParams);
}
});
return injector;
}
Определено отображение
import javax.inject.Singleton;
import javax.ws.rs.Produces;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
@Provider
@Singleton
@Produces
public class JacksonOMP implements ContextResolver<ObjectMapper> {
@Override
public ObjectMapper getContext(Class<?> aClass) {
final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Hibernate4Module());
return mapper;
}
}
Однако - только с этой конфигурацией getContext() никогда не вызывается, поэтому преобразователь никогда не регистрируется. Я застрял в типичном узоре - аннотации-таинственности, где он практически не отслеживается тем, что я на самом деле должен делать. Spring пользователи просто сообщают о регистрации компонента, а контейнер просто выбирает его.
Этот ответ говорит о переопределении моей собственной реализации javax.ws.rs.core.Application. Тем не менее, это выглядит жестко связанным с jersey-guice impementation GuiceContainer как DefaultResourceConfig():
@Override
protected ResourceConfig getDefaultResourceConfig(Map<String, Object> props,
WebConfig webConfig) throws ServletException {
return new DefaultResourceConfig();
}
Я предполагаю, что подкласс GuiceContainer здесь? Или есть еще одна магическая аннотация, которую я пропускаю?
Это кажется довольно распространенным явлением - я удивлен тем, как трудно это доказать с этой комбинацией.