Я пытаюсь создать приложение, используя Джерси, Рест, Tomcat, c3p0 и т. Д.
У меня есть класс ConfigurationManager, который я хочу использовать для одноразового использования, и класс пула подключений. Пул подключений использует Configuration Manager с аннотацией inject, но диспетчер конфигурации внутри пула подключений имеет значение null, по какой-то причине он не внедрен. Он создан по хитрости. Я вижу это по журналу.
Когда я внедряю его в класс ресурсов 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();
}
}