带有可选嵌入式Tomcat容器的Spring Boot中的JNDI



我对spring-boot相当陌生,并且已经实现了一种将数据源放置在JNDI上下文中的方法,方法是遵循How to create JNDI context in spring boot with Embedded Tomcat Container 中给出的建议

我通过将这些bean添加到应用程序中,实现了命名并将数据源放置在JNDI上下文中,如下所示:

@Autowired
Environment env;
public static void main(final String[] args) {
SpringApplication.run(MyApplication.class, args);
}

@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory(){
@Override
public TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(final Tomcat tomcat) {
tomcat.enableNaming();
return super.getTomcatEmbeddedServletContainer(tomcat);
}
@Override
public void postProcessContext(final Context context) {
final String dataSourceURL = env.getProperty("datasource.url");
// more properties
final ContextResource resource = new ContextResource();
resource.setType(DataSource.class.getName());
resource.setProperty("url", dataSourceURL);
// more properties
resource.setName("jdbc/myDB");
resource.setAuth("Container");
resource.setType("javax.sql.DataSource");
resource.setScope("Sharable");
resource.setProperty("factory", "org.apache.commons.dbcp.BasicDataSourceFactory");
context.getNamingResources().addResource(resource);
}
};
}
@Bean(destroyMethod = "")
public DataSource jndiDataSource() throws IllegalArgumentException, NamingException {
final JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
bean.setJndiName("java:comp/env/jdbc/myDB");
bean.setProxyInterface(DataSource.class);
bean.setLookupOnStartup(false);
bean.afterPropertiesSet();
return (DataSource)bean.getObject();
}

到目前为止,一切都很好。但现在项目的规格已经改变了。除了提供一个启动嵌入式Tomcat的胖JAR(如最初计划的那样)之外,我还需要能够提供一个没有引用嵌入式Tomcat的WAR。因此,我创建了额外的打包项目,并通过Maven依赖关系处理了嵌入Tomcat的可选包含。问题是,我不得不将上面显示的代码从我的主类中移到一个单独的包中,我通过Maven依赖关系将其包括在内。现在它不再有作用了。

我承认,我不太熟悉@Autowired和@Bean的Spring魔法是如何运作的,所以我在这里有点磕磕碰碰。

我必须做些什么才能使JNDI上下文的创建在我的主类之外工作?

解决方案非常简单,我可以通过学习更多关于springbean的知识来找到它。我创建了另一个创建bean的类,用@Configuration对其进行了注释,并将其添加到主类的@ComponentScan规范中。看起来像这样:

@ComponentScan(basePackages = {"myBasePackage",
"externalPackageContainingConfiguration"})

externalPackageContainingConfiguration只有在通过Maven依赖项添加其工件时才能找到。有点暴躁,但很管用。

最新更新