Jak połączyć Jackson ObjectMapper z Guice / Jersey

Nie mogę poprawnie zarejestrować mojego modułu Jackson ObjectMapper.

Używam stosu Guice + Jersey + Jackson (FasterXML).

Podążałem za tym, jak dostosować ObjectMapper na podstawie różnych pytań tutaj. W szczególności zadeklarowałem ContextResolver, oznaczony jako @ javax.ws.rs.ext.Provider i @ javax.inject.Singleton.

Mam GuiceServletContextListener na wzór:

@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 zdefiniowany

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

Jednak - przy tej samej konfiguracji getContext () nigdy nie jest wywoływany, więc program mapujący nie jest nigdy rejestrowany. Utknąłem w typowym guice - adnotacjach-tajemnicach, gdzie praktycznie nie da się wyśledzić tego, co mam robić. Wiosenni użytkownicy po prostu zgłaszają rejestrację komponentu, a kontener po prostu go podnosi.

To odpowiedź mówi o nadpisaniu mojej własnej implementacji javax.ws.rs.core.Application. Wygląda to jednak na sztywno w implementacji GuiceContainer w jersey-guice jako DefaultResourceConfig ():

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

Czy przypuszczam, że tutaj jest podklasa GuiceContainer? A może brakuje mi innej magicznej adnotacji?

Wydaje się to dość powszechną rzeczą do zrobienia - jestem zaskoczony, jak trudno jest to zrobić z tą kombinacją guice.

questionAnswers(1)

yourAnswerToTheQuestion