2014-12-04 4 views
2

У меня есть проект джерси 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())); 
    } 
} 

ответ

0

Так начинается кот в другом процессе, Guice инжектор, созданный в Джерси App недоступен в StartApp. Гиксовый инжектор должен быть создан в StartApp для получения JdbcTemplate instamnce

JdbcTemplate jdbcTemplate = Guice.createInjector(new PaymentGatewayModule()).getInstance(JdbcTemplate.class); 
Смежные вопросы