Spring Boot仍然需要web.xml

时间:2016-12-14 15:31:48

标签: spring spring-boot servlet-3.0

立即研究Spring Boot并希望正确使用它,就像使用Java配置一样,最终没有任何web.xml。因此,棘手的部分是生产环境需要经典的WAR文件。

因此,我在Maven WAR文件中指定了pom.xml打包,主Application类扩展了SpringBootServletInitializer

工作得很好。现在,棘手的部分是在生产环境中Datasource是通过JNDI配置的。在经典的Spring应用程序中,您可以使用web.xmlresource-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引导程序有关......所以,真正寻找任何提示,建议它可能是什么!!!

感谢任何帮助!

1 个答案:

答案 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;