Spring Boot仍然需要web.xml中的resource-ref

Mat*_*ner 7 spring servlet-3.0 spring-boot

现在查看Spring Boot并希望正确地执行它,就像使用Java配置一样,最终没有任何配置web.xml.因此,棘手的部分是生产环境需要经典WAR文件.

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

工作得很好.现在,棘手的部分是在生产环境中Datasource通过提供JNDI.在经典的Spring应用程序中,您将在web.xml使用a中引用此依赖项,resource-ref如下所示:

 <resource-ref>
    <res-ref-name>jdbc/DefaultDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
</resource-ref>
Run Code Online (Sandbox Code Playgroud)

我所做的所有研究似乎表明我可以摆脱web.xml它并用相应的context.xml文件替换它(在META-INF文件夹中):

   <Resource name="jdbc/DefaultDB"
          auth="Container"
          type="javax.sql.DataSource"
          factory="com.sap.jpaas.service.persistence.core.JNDIDataSourceFactory"/>
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用:/

有趣的是,一个简单的servlet3 Web应用程序就可以正常工作,请参阅[ https://github.com/steinermatt/servlet3-sample].

因此,我很想相信它对Spring Boot应用程序不起作用的根本原因与Spring Boot引导程序有关......所以,真正寻找任何提示,建议它可能是什么!

任何帮助表示赞赏!

小智 0

默认情况下,JNDI 在嵌入式 Tomcat 中处于禁用状态。

您可以使用以下代码在 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);
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

您可以通过自动装配在控制器中使用 DataSource bean。

@Autowired
private DataSource dataSource;
Run Code Online (Sandbox Code Playgroud)