- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在应用程序首次启动时进行一些数据库清理。首先,我定义了 JNDI 连接,如下所示:
@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
Tomcat tomcat) {
tomcat.enableNaming();
return super.getTomcatEmbeddedServletContainer(tomcat);
}
@Override
protected void postProcessContext(Context context) {
ContextResource resource = new ContextResource();
resource.setName("jdbc/myDataSource");
resource.setType(DataSource.class.getName());
resource.setProperty("driverClassName", "your.db.Driver");
resource.setProperty("url", "jdbc:yourDb");
context.getNamingResources().addResource(resource);
}
};
}
然后我希望在ApplicationListener ContextRefreshedEvent中检索资源,ApplicationListener实现如下:
@Component
public class StartupConfiguration implements ApplicationListener<ContextRefreshedEvent>
{
@Override
public void onApplicationEvent(ContextRefreshedEvent event)
{
ApplicationContext ctx = event.getApplicationContext();
Context initialContext = new InitialContext();
DataSource datasource = (DataSource) initialContext.lookup("java:comp/env/jdbc/myDataSource");
...
}
}
问题是它无法找到 java:comp/env/jdbc/myDataSource,我已经使用各种事件进行了测试,唯一有效的事件是在我所做的 RequestHandledEvent
中不认为这是一个好的解决方案。
最佳答案
我在以下堆栈溢出问题中找到了答案stackoverflow.com/questions/27822619
我会引用安迪·威尔金森
Tomcat uses the thread's context class loader to determine the JNDI context to perform the lookup against. If the thread context class loader isn't the web app classloader then the JNDI context is empty, hence the lookup failure.
安迪·威尔金森建议的修复
@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
Tomcat tomcat) {
tomcat.enableNaming();
TomcatEmbeddedServletContainer container =
super.getTomcatEmbeddedServletContainer(tomcat);
for (Container child: container.getTomcat().getHost().findChildren()) {
if (child instanceof Context) {
ClassLoader contextClassLoader =
((Context)child).getLoader().getClassLoader();
Thread.currentThread().setContextClassLoader(contextClassLoader);
break;
}
}
return container;
}
@Override
protected void postProcessContext(Context context) {
ContextResource resource = new ContextResource();
resource.setName("jdbc/myDataSource");
resource.setType(DataSource.class.getName());
resource.setProperty("driverClassName", "your.db.Driver");
resource.setProperty("url", "jdbc:yourDb");
context.getNamingResources().addResource(resource);
}
};
}
关于java - Spring应用程序监听器-ContextRefreshedEvent java :comp/env/jdbc/db not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31482356/
我想测试像 Example 这样的类,它处理 ContextRefreshedEvent 并在处理程序方法中连接到服务器: public class Example { @EventListe
我创建了 Spring 应用程序,并且正在独立的 Java 应用程序中加载应用程序上下文。我的代码如下 public class Application { public static voi
我正在尝试 ApplicationListener,但每次都会调用 ContextRefreshedEvent。我想知道何时调用 ContextStartedEvent。 public class C
我知道它会在 ApplicationContext 完全加载时触发一次,但是在运行时之后呢? “Refreshed”一词意味着它将在刷新时触发,但我想知道 Spring 有什么资格作为 Applica
我注册了一个 Spring ApplicationListener bean 来监听 ContextRefreshed 事件。不过,出于某种奇怪的原因,在上下文初始化完成时,我得到了对 onApp
我提出了两种情况,一种是使用 bean 工厂注册的 bean,另一种是通过自动扫描包中的注释定义(例如 @Component)创建的 bean。 bean 类使用用 @EventListener 和
在 Spring 5.x 中,以下事件有什么区别? 上下文刷新事件 上下文启动事件 上下文停止事件 上下文关闭事件 哪个事件与 servlet 上下文事件相关(根据 https://docs.orac
我想为此私有(private)方法创建 JUnit 测试: @Component public class ReportingProcessor { @EventListener pr
我试图在应用程序首次启动时进行一些数据库清理。首先,我定义了 JNDI 连接,如下所示: @Bean public TomcatEmbeddedServletContainerFactory tomc
我有一个 bean (SettingService),它用 @Transactional 注释装饰并注入(inject)到另一个 bean 中,在上下文刷新事件中调用这个 bean。 public c
我是一名优秀的程序员,十分优秀!