У меня есть проект джерси 2 с Guice, используемым для DI (через мост hk2). Spring JDBC используется для вызовов БД и настроен через Guice. Я запускаю его локально со встроенным tomcat. Этой установка отлично работает для приложений, т.е. я могу получить доступ к базе данных в моем джерси ресурсахИспользование Guice со встроенным Tomcat?
Теперь я хочу писать тесты для приложения, в котором мне нужен доступ к базе данных для первоначальной настройки, но я получаю NullPointerException на введенных объектах.
Основной файл (здесь впрыснуть дает нулевое значение)
public class StartApp {
@Inject
private JdbcTemplate jdbcTemplate;
public static void main(String[] args) throws Exception {
startTomcat();
}
private static void startTomcat() throws Exception {
String webappDirLocation = "src/main/webapp/";
Tomcat tomcat = new Tomcat();
String webPort = System.getProperty("app.port", "8080");
tomcat.setPort(Integer.valueOf(webPort));
tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());
tomcat.start();
new StartApp().initDatabase();
tomcat.getServer().await();
}
public void initDatabase() throws Exception {
String sql = new String(Files.readAllBytes(Paths.get(StartApp.class.getClassLoader().getResource("db_base.sql").toURI())), "UTF-8");
jdbcTemplate.execute(sql);
}
}
JdbcTemplate инъекционные терпит неудачу только здесь. В реальных ресурсах трикотажа работает отлично.
web.xml (показывая Guice только часть)
<filter>
<filter-name>Guice Filter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Guice Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>MyGuiceServletContextListener</listener-class>
</listener>
MyGuiceServletContextListener
public class MyGuiceServletContextListener extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(JdbcTemplate.class).toProvider(JdbcTemplateProvider.class).in(Scopes.SINGLETON);
}
});
}
}
JerseyConfig
public class JerseyConfig extends ResourceConfig {
@Inject
public JerseyConfig(ServiceLocator serviceLocator, ServletContext servletContext) {
packages("resources");
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
guiceBridge.bridgeGuiceInjector((Injector) servletContext.getAttribute(Injector.class.getName()));
}
}