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 の組み合わせを実行するのがいかに難しいかを知って驚いています。