2011-12-18 3 views
1

Я пытаюсь создать приложение, используя Джерси, 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(); 
} 
} 

ответ

3

поле ConfigurationManager cManager будет введен, когда строительство объекта завершено. Вот почему вы получаете NPE в конструкторе, и все в порядке в классе Test.java.

Рассмотрите возможность замены инъекции в полевых условиях с впрыск конструктора.

Просто попробуйте этот код

public class ConnectionPool { 
    @Inject 
    public ConnectionPool(ConfigurationManager cManager) { 
     ... 
    } 

} 
+0

Спасибо большое, я, очевидно, нуб :). Сейчас это работает. Однако, возможно, вы можете помочь мне с этой другой аналогичной проблемой. Я также пытаюсь ввести ConfigurationManager в StartupServlet, чтобы использовать его в методе init (см. Web.xml выше). Я тоже получаю NPE. –

+0

Похоже, вы не можете вводить в сервлеты, не управляемые Guice. Рассмотрим переход конфигурации StartupServlet в класс GuiceServletConfiguration. –

Смежные вопросы