【问题标题】:How do you use a Tomcat JNDI JDBC datasource in Spring Boot如何在 Spring Boot 中使用 Tomcat JNDI JDBC 数据源
【发布时间】:2014-04-01 19:52:00
【问题描述】:

我有一个 Spring Boot 应用程序并希望作为 WAR 部署到 Tomcat 7。作为其中的一部分,我需要将配置保留在 WAR 之外,以便我可以将相同的战争部署到我的阶段和生产服务器并拥有它通过配置获取 mysql 连接。

为此,我想将我的 Spring Boot 应用程序配置为在 Tomcat 实例中使用配置为 JNDI 数据源的 mysql 连接。

spring boot 可以做到这一点吗?如果可以怎么办?

另外,这在 Spring 4 中很容易做到,无需借助基于 xml 的配置。

【问题讨论】:

  • 猜测:你不能使用 org.springframework.jndi.JndiObjectFactoryBean

标签: tomcat7 spring-data-jpa spring-boot


【解决方案1】:

对使用 Spring Boot 和外部 Tomcat 的所有人的提示。请确保您的战争不包含任何 tomcat 罐子。 同一个jar的多个版本会产生隐藏的ClassCastException,表现为javax.naming.NamingException。

【讨论】:

    【解决方案2】:

    如果您使用的是 Spring Boot 1.2 或更高版本,这会变得更容易。您可以将其添加到 application.properties

    spring.datasource.jndi-name=java:comp/env/jdbc/my_database
    

    相关文档:http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-connecting-to-a-jndi-datasource

    【讨论】:

    • 这曾经对我有用,但现在我得到了javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
    • cbmeeks,你能解决这个异常吗?我也有同样的问题。
    • dustin.schultz,你知道 Spring Boot 是否适用于不在本地主机中的 jndl。像这样:spring.datasource.jndi-name=java:comp/env/192.151.101.179:7002/jdbc/Procesos
    • InitialContext 错误真的很烦人,因为我在配置中使用数据源查找删除了它,但是当我打算使用 application-test.yml 时,集成测试仍然通过检查 application.yml 失败
    【解决方案3】:
    @Bean
    public DataSource dataSource() {
      JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
      DataSource dataSource = dataSourceLookup.getDataSource("jdbc/apolloJNDI");
      return dataSource;
    }
    

    不需要“java:comp/env/”,因为 JndiDataSourceLookup 内部调用了添加此部分的 convertJndiName。在其他类中,您应该设置完整的路径。

    【讨论】:

      【解决方案4】:

      这就是我所做的。

      将以下内容添加到Application.java

      @Bean
      public DataSource dataSource() {
        JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
        DataSource dataSource = dataSourceLookup.getDataSource("java:comp/env/jdbc/mysqldb");
        return dataSource;
      }
      

      然后按照https://spring.io/guides/gs/accessing-data-jpa/ 中的示例设置TransactionManager 和Hibernate 特定属性。

      【讨论】:

      • 如果您使用的是@EnableAutoConfiguration,则不需要设置事务管理器(或任何基本使用的休眠内容)。
      • 部署到 tomcat 时,我得到“'hibernate.dialect' not set”。有没有办法在不使用@EnableAutoConfiguration 创建HibernateJpaVendorAdaptersetDatabase(Database.ORACLE) 的情况下设置它?
      • 尝试“spring.jpa.hibernate.dialect”(或“spring.jpa.hibernate”。一般来说,用于休眠原生特性,而不是 Spring 特性)。
      • 其实就是“spring.jpa.properties.hibernate.dialect”(见here),还有spring.jpa.properties.hibernate.*”(“spring.jpa.hibernate.*”用于一些最常用的特定属性)。
      • 谢谢!我想我也应该阅读HibernateJpaAutoConfiguration 的源代码。
      猜你喜欢
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 2020-03-06
      • 1970-01-01
      • 2017-05-21
      相关资源
      最近更新 更多