如何在Spring Boot中使用Tomcat JNDI JDBC数据源

20

我有一个Spring Boot应用程序,并希望将其部署为WAR到Tomcat 7。为此,我需要将配置文件放在WAR之外,这样我就可以将相同的WAR部署到我的测试和生产服务器上,并通过配置获取mysql连接。

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

Spring Boot能否做到这一点?如果可以,具体如何实现呢?

或者,是否可以在Spring 4中轻松完成此操作,而不必使用基于xml的配置方式?


猜测:你不能使用org.springframework.jndi.JndiObjectFactoryBean吗? - cfrick
4个回答

16

2
这个以前对我来说是可以工作的,但现在我得到了一个 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
cbmeeks,你能解决这个异常吗?我也遇到了同样的问题。 - J. Abel
dustin.schultz,你知道Spring Boot是否可以与不在localhost上的jndl一起使用吗?类似这样:spring.datasource.jndi-name=java:comp/env/192.151.101.179:7002/jdbc/Procesos - J. Abel
InitialContext错误真的很烦人,因为我在配置中使用数据源查找将其删除了,但是集成测试仍然通过检查application.yml而失败,而我本意是要使用application-test.yml。 - Prabhat Gaur

6
@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,则不需要设置事务管理器(或任何基本用法的Hibernate内容)。 - Dave Syer
在部署到Tomcat时,我遇到了"'hibernate.dialect'未设置"的问题。有没有一种方法可以在不创建HibernateJpaVendorAdapter和使用@EnableAutoConfiguration中的setDatabase(Database.ORACLE)的情况下进行设置? - Yue Liu
尝试使用“spring.jpa.hibernate.dialect”(或者对于Hibernate本地特性通常使用“spring.jpa.hibernate.”)。 - Dave Syer
1
实际上,它是"spring.jpa.properties.hibernate.dialect"(请参见此处),而"spring.jpa.properties.hibernate."("spring.jpa.hibernate."用于一些最常用的特定属性)。 - Dave Syer
谢谢!我应该也读一下HibernateJpaAutoConfiguration的源代码。 - Yue Liu

0
对于所有使用外部Tomcat的Spring Boot用户,这里有一个提示。请确保您的war文件中不包含任何tomcat jars。同一jar包的多个版本会产生由javax.naming.NamingException表现出来的隐藏ClassCastException。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接