Spring Application Listener - 找不到ContextRefreshedEvent java:comp / env / jdbc / db

时间:2015-07-17 18:25:31

标签: java spring

我正在尝试在应用程序首次启动时进行一些数据库清理。 首先,我按如下方式定义了我的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,我不认为它一个很好的解决方案。

1 个答案:

答案 0 :(得分:1)

我在下面的堆栈溢出问题中找到了答案 stackoverflow.com/questions/27822619

我会引用安迪威尔金森的话

  

Tomcat使用线程的上下文类加载器来确定要执行查找的JNDI上下文。如果线程上下文类加载器不是Web应用程序类加载器,则JNDI上下文为空,因此查找失败。

Andy Wilkinson提出的建议

var zoom = d3.behavior.zoom()
  .on("zoom", zoomed);

...

function initAxes(data) {
  var xAxisExtent = d3.extent(data, function(d) {
    return +d.date;
  });
  xAxisScale.domain([new Date(xAxisExtent[0]), new Date(xAxisExtent[1])]);
  yAxisScale.domain([0, d3.max(data, function(d) {
    return d.pval;
  })]);
  zoom.x(xAxisScale);
  zoom.y(yAxisScale);
  drawAxes();
}

...

function redrawBars() {
  chart.selectAll(".data_bar")
    .attr("transform", function(d) {
      return "translate("+(xAxisScale(d.date) + margin.left)+"," + yAxisScale(d.pval) + ")";
    })
    .attr("height", function(d) {
      return (height - yAxisScale(d.pval));
    });
}