Wie man Jackson ObjectMapper mit Guice / Jersey einhakt

Ich kann mein Jackson ObjectMapper-Modul scheinbar nicht richtig registrieren.

Ich verwende einen Guice + Jersey + Jackson (FasterXML) -Stack.

Ich habe hier anhand verschiedener Fragen nachverfolgt, wie der ObjectMapper angepasst wird. Insbesondere habe ich einen ContextResolver deklariert, der als @ javax.ws.rs.ext.Provider und @ javax.inject.Singleton markiert ist.

Ich habe einen GuiceServletContextListener im Sinne von:

@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;
}

Mapper definiert

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;
  }
}

Mit dieser Konfiguration wird getContext () jedoch niemals aufgerufen, sodass der Mapper niemals registriert wird. Ich stecke in einem typischen Rätsel fest - Annotations-Rätsel, bei dem es praktisch nicht nachvollziehbar ist, was ich eigentlich tun soll. Spring-Benutzer melden lediglich die Registrierung der Komponente, und der Container holt sie ab.

Diese answer spricht über das Überschreiben meiner eigenen javax.ws.rs.core.Application-Implementierung. Bei der Implementierung von GuiceContainer als DefaultResourceConfig () sieht dies jedoch verdrahtet aus:

@Override
protected ResourceConfig getDefaultResourceConfig(Map<String, Object> props,
        WebConfig webConfig) throws ServletException {
    return new DefaultResourceConfig();
}

Soll ich hier GuiceContainer unterordnen? Oder gibt es eine andere magische Anmerkung, die mir fehlt?

Dies scheint eine ziemlich häufige Aufgabe zu sein - ich bin überrascht, wie schwierig es ist, mit dieser Kombination von Guices umzugehen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage