我似乎无法正确注册我的 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 实现。但是,这在 GuiceContainer 的 jersey-guice 实现中看起来是硬连线的,即 DefaultResourceConfig():
@Override
protected ResourceConfig getDefaultResourceConfig(Map<String, Object> props,
WebConfig webConfig) throws ServletException {
return new DefaultResourceConfig();
}
我应该在这里继承 GuiceContainer 吗?还是我缺少其他一些魔术注释?
这似乎是一件相当普遍的事情——我很惊讶用这种 guice 组合来证明它是多么困难。