Non riesco a ottenere il mio modulo ObjectMapper Jackson registrato correttamente.Come agganciare Jackson ObjectMapper con Guice/Jersey
Sto usando uno stack Guice + Jersey + Jackson (FasterXML).
Ho seguito come personalizzare l'ObjectMapper in base alle varie domande qui. In particolare, ho dichiarato ContextResolver, contrassegnato come @javax.ws.rs.ext.Provider e @javax.inject.Singleton.
Ho un GuiceServletContextListener lungo le linee di:
@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 definito
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;
}
}
Tuttavia - con la sola questa configurazione, getContext() non viene mai chiamato, in modo che il mapping non è mai registrati. Sono bloccato in un tipico guizzo - annotazioni-mistero, in cui è praticamente impossibile da definire per quello che dovrei fare in realtà. Gli utenti Spring hanno appena segnalato la registrazione del componente e il contenitore lo riprende.
This risposta parla dell'override della mia implementazione javax.ws.rs.core.Application. Tuttavia, questo sembra hard-wired nel impementation jersey-Guice di GuiceContainer essere DefaultResourceConfig():
@Override
protected ResourceConfig getDefaultResourceConfig(Map<String, Object> props,
WebConfig webConfig) throws ServletException {
return new DefaultResourceConfig();
}
dovrei sottoclasse GuiceContainer qui? O c'è qualche altra annotazione magica che mi manca?
Questa sembra una cosa abbastanza comune da voler fare - Sono sorpreso da quanto duramente stia provando a fare con questa combinazione di scommesse.
Questo è molto utile. Il mio problema particolare era in realtà che avevo i jackson * 2 * (sia la versione codehaus che la versione fasterxml), quindi gli objectmapper sono stati completamente ignorati perché erano del tipo sbagliato. – user340535
Ho avuto lo stesso conflitto di dipendenze (codehaus + fasterxml): 'JsonIgnore' non funzionava affatto. Nel mio caso, jackson codehaus (jackson-mapper-asl o core-asl) è stato collegato a una dipendenza del pacchetto documentdb azzurro ed è stato rimosso completamente (mediante esclusione pom) per mantenere solo la versione più recente (fasterxml). Grazie a @ user340535 per il tuo commento che mi aiuta a correggere il gancio di JacksonJsonProvider! – boly38
Per qualche motivo la versione con annotazioni non funziona con me in Guice 4 usando JerseyGuiceServletContextListener. Cosa può causarlo? Con il binding normale e le classi extra funziona senza problemi. – Atais