立即研究Spring Boot并希望正确使用它,就像使用Java配置一样,最终没有任何web.xml
。因此,棘手的部分是生产环境需要经典的WAR
文件。
因此,我在Maven WAR
文件中指定了pom.xml
打包,主Application类扩展了SpringBootServletInitializer
。
工作得很好。现在,棘手的部分是在生产环境中Datasource
是通过JNDI
配置的。在经典的Spring应用程序中,您可以使用web.xml
在resource-ref
中引用此依赖关系,如下所示:
<resource-ref>
<res-ref-name>jdbc/DefaultDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
</resource-ref>
我所做的所有研究似乎表明我可以摆脱web.xml
并将其替换为相应的context.xml
文件(在META-INF文件夹中):
<Resource name="jdbc/DefaultDB"
auth="Container"
type="javax.sql.DataSource"
factory="com.sap.jpaas.service.persistence.core.JNDIDataSourceFactory"/>
不幸的是,这不起作用:/
有趣的是,一个简单的servlet3网络应用就可以正常工作,请参阅[https://github.com/steinermatt/servlet3-sample]。
所以,我很想相信它对Spring Boot应用程序不起作用的根本原因与Spring Boot引导程序有关......所以,真正寻找任何提示,建议它可能是什么!!!
感谢任何帮助!
答案 0 :(得分:0)
默认情况下,嵌入式Tomcat中禁用JNDI。
您可以使用以下代码在tomcat中启用JNDI。以下代码将帮助您初始化DataSource spring bean。
@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);
}
};
}
您可以使用自动连线在控制器中使用DataSource bean。
@Autowired
private DataSource dataSource;