Guice не работает должным образом (с Tomcat, Jersey ...) - PullRequest
1 голос
/ 18 декабря 2011

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

1 Ответ

3 голосов
/ 20 декабря 2011

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

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

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

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...