Я пытаюсь создать приложение, используя Джерси, Rest, Tomcat, C3P0 и т.д.Guice не работает, как ожидалось (с Tomcat, Джерси ...)
У меня есть класс ConfigurationManager Я хочу быть нетерпеливым singleton и класс пула соединений. Я также хочу быть синглом. Пул соединений использует диспетчер конфигурации, аннотированный с помощью приложения, но диспетчер конфигурации внутри пула пулов пуст, он по какой-то причине не вводится. Он создается через guice, я вижу это из журнала.
Когда я ввожу его в класс ресурсов Rest, он работает так, как ожидалось.
Также, когда я ввожу его в StartupServlet, он равен нулю.
Я был бы очень признателен, если кто-нибудь может пролить свет на это. Ниже вы можете найти web.xml и классы.
web.xml
<servlet>
<servlet-name>StartupServlet</servlet-name>
<servlet-class>net.nemanjakovacevic.ft1p.configuration.StartupServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- set up Google Guice Servlet integration -->
<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>net.nemanjakovacevic.ft1p.configuration.GuiceServletConfiguration</listener-class>
</listener>
GuiceServletConfiguration.java
public class GuiceServletConfiguration extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new GuiceConfigurationModule(), new JerseyServletModule() {
@Override
protected void configureServlets() {
/* bind the REST resources */
bind(Test.class);
serve("/*").with(GuiceContainer.class);
}
});
}
}
GuiceConfigurationModule.java
public class GuiceConfigurationModule extends AbstractModule {
@Override
protected void configure() {
bind(ConfigurationManager.class).asEagerSingleton();
bind(ConnectionPool.class).asEagerSingleton();
}
}
ConfigurationManager
public class ConfigurationManager {
// Nothing important here, loading from config file
}
ConnectionPool (Это не работает здесь)
public class ConnectionPool {
private static final Logger log = LoggerFactory.getLogger(ConnectionPool.class);
private ComboPooledDataSource pooledDataSource;
@Inject
private ConfigurationManager cManager;
public ConnectionPool() {
log.info("Initializing c3p0 coonection pool");
pooledDataSource = new ComboPooledDataSource();
try {
//Null pointer exception here, cManager is null
pooledDataSource.setDriverClass(cManager.getJdbcDriverClassName());
pooledDataSource.setJdbcUrl(cManager.getJdbcUrl());
pooledDataSource.setUser(cManager.getDatabaseUsername());
pooledDataSource.setPassword(cManager.getDatabasePassword());
} catch (PropertyVetoException e) {
log.error("Exception during c3p0 initalisation.", e);
//TODO obrada izuzetaka
}
}
}
Test.java (Это работает здесь)
@Path("/test")
public class Test {
@Inject
ConfigurationManager cManager;
@GET
@Path("/{param}")
public Response getMsg(@PathParam("param") String msg){
// cManager is not null, it's injected as it should be
String output = cManager.getDatabaseHostName();
return Response.status(200).entity(output).build();
}
}
Спасибо большое, я, очевидно, нуб :). Сейчас это работает. Однако, возможно, вы можете помочь мне с этой другой аналогичной проблемой. Я также пытаюсь ввести ConfigurationManager в StartupServlet, чтобы использовать его в методе init (см. Web.xml выше). Я тоже получаю NPE. –
Похоже, вы не можете вводить в сервлеты, не управляемые Guice. Рассмотрим переход конфигурации StartupServlet в класс GuiceServletConfiguration. –