gpt4 book ai didi

java - 使用 JNDI 配置数据源 使用外部 Tomcat 9 服务器 : Spring Boot

转载 作者:行者123 更新时间:2023-12-03 11:20:09 49 4
gpt4 key购买 nike

我有一个 SpringBootApplication,打包为 war 文件:

@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 查找中找不到键。 JNDI 在 Spring Boot 的嵌入式 Tomcat 中被禁用,因此您需要使用 Tomcat#enableNaming 启用它。一旦完成,您将需要在 JNDI 中创建一个查找条目。您可以引用我从 Spring Boot 项目维护者存储库之一复制的以下代码 GitHub repo JNDI-Tomcat

@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/bonanza");
resource.setType(DataSource.class.getName());
resource.setProperty("driverClassName", "your.db.Driver");
resource.setProperty("url", "jdbc:yourDb");

context.getNamingResources().addResource(resource);
}
};
}
[编辑]
由于您没有使用嵌入式 tomcat 服务器,您可以通过使用 tomcat 配置文件对其进行配置来配置 JNDI:
在 server.xml 中,在 <GlobalNamingResources> 下创建一个资源
<Resource auth="Container" driverClassName="..." 
maxActive="..."
maxIdle="..."
maxWait="..."
name="jdbc/bonanza"
username="..."
password="..."
type="..."
url="..."/>
在 Context.xml 中,可以链接资源
<context>
<ResourceLink auth="Container" name="jdbc/bonanza" global="jdbc/bonanza" type="javax.sql.DataSource" />
</context>
另外,请确保您没有使用 spring-boot main 启动应用程序。方法。您需要使用 maven/gradle 构建 war 文件,然后将其部署到 tomcat 并进行测试。

关于java - 使用 JNDI 配置数据源 使用外部 Tomcat 9 服务器 : Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64076682/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com