gpt4 book ai didi

tomcat - 在嵌入式 Tomcat 中使用 Guice?

转载 作者:行者123 更新时间:2023-11-28 21:53:26 24 4
gpt4 key购买 nike

我有一个 jersey 2 项目,Guice 用于 DI(通过 hk2 桥)。 Spring JDBC 用于数据库调用并通过 Guice 配置。我在本地使用嵌入式 tomcat 运行它。此设置适用于应用程序,即我能够访问我的 Jersey 资源中的数据库

现在我想为初始设置需要数据库访问权限的应用程序编写测试用例,但我在注入(inject)的对象上遇到了 NullPointerException

主文件(这里注入(inject)给空值)

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 注入(inject)仅在此处失败。在实际的 Jersey 资源中,它工作正常。

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);
}
});
}
}

Jersey 配置

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()));
}
}

最佳答案

由于 tomcat 在不同的进程中启动,因此在 Jersey App 中创建的 guice injector 在 StartApp 中无法访问。必须在 StartApp 中创建 Guice 注入(inject)器才能获取 JdbcTemplate 实例

JdbcTemplate jdbcTemplate = Guice.createInjector(new PaymentGatewayModule()).getInstance(JdbcTemplate.class);

关于tomcat - 在嵌入式 Tomcat 中使用 Guice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27295618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com