Ответ 1
Я застрял в типичном узоре - аннотации-тайны, где это практически не отслеживая того, что я на самом деле должен делать. Spring пользователи просто сообщают о регистрации компонента, а контейнер просто подбирает его.
Вы действительно должны прочитать отличную документацию по Guice. Guice очень прост в использовании, он имеет очень небольшое количество базовых понятий. Ваша проблема заключается в том, что вы смешали инъекцию зависимостей Джерси JAX-RS и инъекцию зависимости Guice. Если вы используете GuiceContainer
, тогда вы заявляете, что будете использовать Guice для всех своих DI, поэтому вам нужно добавить привязки с помощью Guice, а не с JAX-RS.
Например, вам не нужно ContextResolver
, вместо этого вы должны использовать простой Guice Provider
:
import com.google.inject.Provider;
public class ObjectMapperProvider implements Provider<ObjectMapper> {
@Override
public ObjectMapper get() {
final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Hibernate4Module());
return mapper;
}
}
Затем вы должны добавить соответствующую привязку к вашему модулю:
bind(ObjectMapper.class).toProvider(ObjectMapperProvider.class).in(Singleton.class);
Это свяжет ObjectMapper
, но недостаточно использовать Джерси с Джексоном. Вам понадобится какой-то MessageBodyReader
/MessageBodyWriter
, например. JacksonJsonProvider
. Для этого вам понадобится другой провайдер:
public class JacksonJsonProviderProvider implements Provider<JacksonJsonProvider> {
private final ObjectMapper mapper;
@Inject
JacksonJsonProviderProvider(ObjectMapper mapper) {
this.mapper = mapper;
}
@Override
public JacksonJsonProvider get() {
return new JacksonJsonProvider(mapper);
}
}
Затем привяжите его:
bind(JacksonJsonProvider.class).toProvider(JacksonJsonProviderProvider.class).in(Singleton.class);
Это все, что вам нужно сделать - никакого подкласса не требуется.
Однако есть место для оптимизации размера кода. Если бы я был вами, я бы использовал @Provides
-методы:
@Provides @Singleton
ObjectMapper objectMapper() {
final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Hibernate4Module());
return mapper;
}
@Provides @Singleton
JacksonJsonProvider jacksonJsonProvider(ObjectMapper mapper) {
return new JacksonJsonProvider(mapper);
}
Эти методы должны быть добавлены к одному из ваших модулей, например. анонимному ServletModule
. Тогда вам не понадобятся отдельные классы поставщиков.
BTW, вы должны использовать JerseyServletModule
вместо простого ServletModule
, он предоставляет множество полезных привязок для вас.