Java 使用外部Tomcat9服务器使用JNDI配置数据源:Spring引导
我有一个SpringBootApplication,打包为war文件:Java 使用外部Tomcat9服务器使用JNDI配置数据源:Spring引导,java,spring-boot,spring-mvc,jndi,tomcat9,Java,Spring Boot,Spring Mvc,Jndi,Tomcat9,我有一个SpringBootApplication,打包为war文件: @SpringBootApplication(exclude = {SecurityAutoConfiguration.class}) public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(Applic
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
在application.properties上:
spring.datasource.jndi-name=java:comp/env/jdbc/bonanza
但在Tomcat 9中部署war时,我在日志中看到了这些消息:
Name [spring.datasource.jndi-name] is not bound in this Context. Unable to find [spring.datasource.jndi-name].. Returning null.
日志:
12:37:53.989 [main] DEBUG o.springframework.jndi.JndiTemplate - Looking up JNDI object with name [java:comp/env/spring.datasource.jndi-name]
12:37:53.989 [main] DEBUG o.s.jndi.JndiLocatorDelegate - Converted JNDI name [java:comp/env/spring.datasource.jndi-name] not found - trying original name [spring.datasource.jndi-name]. javax.naming.NameNotFoundException: Name [spring.datasource.jndi-name] is not bound in this Context. Unable to find [spring.datasource.jndi-name].
12:37:53.990 [main] DEBUG o.springframework.jndi.JndiTemplate - Looking up JNDI object with name [spring.datasource.jndi-name]
12:37:53.991 [main] DEBUG o.s.jndi.JndiPropertySource - JNDI lookup for name [spring.datasource.jndi-name] threw NamingException with message: Name [spring.datasource.jndi-name] is not bound in this Context. Unable to find [spring.datasource.jndi-name].. Returning null.
12:37:53.995 [main] DEBUG o.springframework.jndi.JndiTemplate - Looking up JNDI object with name [java:comp/env/spring.datasource.jndi-name]
12:37:53.996 [main] DEBUG o.s.jndi.JndiLocatorDelegate - Converted JNDI name [java:comp/env/spring.datasource.jndi-name] not found - trying original name [spring.datasource.jndi-name]. javax.naming.NameNotFoundException: Name [spring.datasource.jndi-name] is not bound in this Context. Unable to find [spring.datasource.jndi-name].
12:37:53.996 [main] DEBUG o.springframework.jndi.JndiTemplate - Looking up JNDI object with name [spring.datasource.jndi-name]
12:37:53.997 [main] DEBUG o.s.jndi.JndiPropertySource - JNDI lookup for name [spring.datasource.jndi-name] threw NamingException with message: Name [spring.datasource.jndi-name] is not bound in this Context. Unable to find [spring.datasource.jndi-name].. Returning null.
12:37:53.998 [main] DEBUG o.s.c.e.PropertySourcesPropertyResolver - Found key 'spring.datasource.jndi-name' in PropertySource 'configurationProperties' with value of type String
在我的tomcat9/conf/context.xml:
<Resource name="jdbc/bonanza"
auth="Container"
type="javax.sql.DataSource"
maxTotal="100"
maxIdle="30"
maxWaitMillis="10000"
username="a_usr"
password="Mu*7gydlcdstg100@"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://172.175.77.55:3306/a_db"
/>
正如错误所示,spring boot无法在JNDI查找中找到密钥。Spring boot的嵌入式Tomcat中禁用了JNDI,因此需要使用
Tomcat#enableNaming
启用JNDI,一旦启用,就需要在JNDI中创建一个查找条目。您可以参考下面的代码,这些代码是我从SpringBoot项目维护人员存储库中复制的
[编辑]
由于您没有使用嵌入式tomcat服务器,您可以通过使用tomcat配置文件配置JNDI来配置它:
在server.xml中,在
在Context.xml中,可以链接资源
<context>
<ResourceLink auth="Container" name="jdbc/bonanza" global="jdbc/bonanza" type="javax.sql.DataSource" />
</context>
另外,确保您没有使用spring boot
main
方法启动应用程序。您需要使用maven/gradle构建war文件,然后将其部署到tomcat并对其进行测试。您使用的是嵌入式tomcat服务器还是外部tomcat?外部tomcat,sirI在下面的答案中做了一些更改,您可以尝试一下。我这样做的结果也是一样的,先生:-(@NuñitodelaCalzada问题出在哪里?我怀疑你是在用spring bootmain
方法测试,而不是部署战争。是这样吗?确实是这样:-)
<Resource auth="Container" driverClassName="..."
maxActive="..."
maxIdle="..."
maxWait="..."
name="jdbc/bonanza"
username="..."
password="..."
type="..."
url="..."/>
<context>
<ResourceLink auth="Container" name="jdbc/bonanza" global="jdbc/bonanza" type="javax.sql.DataSource" />
</context>