使用嵌入式Tomcat和JNDI的Spring Boot

3

我正在使用Spring Boot与嵌入式Tomcat,并尝试使用JNDI,但出现以下错误:

javax.naming.NameNotFoundException: Name [jdbc/dataSource]

如果有什么建议将不胜感激。

这是我的代码:

@Configuration
public class TomcatJndiConfiguration{

@Value("${database.driver}")
private String driverClassName;

@Value("${database.url}")
private String databaseUrl;

@Value("${database.username}")
private String databaseUsername;

@Value("${database.password}")
private String databasePassword;

@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/dataSource");
            resource.setType(DataSource.class.getName());
            resource.setProperty("driverClassName", driverClassName);
            resource.setProperty("url", databaseUrl);
            resource.setProperty("password", databaseUsername);
            resource.setProperty("username", databasePassword);
            context.getNamingResources().addResource(resource);
        }
    };
}

@Bean
public DataSource dataSource() throws IllegalArgumentException, NamingException {
    JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
    bean.setJndiName("jdbc/dataSource");
    bean.setLookupOnStartup(true);
    bean.setProxyInterface(DataSource.class);
    bean.setResourceRef(true);
    bean.afterPropertiesSet();
    return (DataSource) bean.getObject();

}
Stacktrace is: 
Caused by: javax.naming.NameNotFoundException: Name [jdbc/dataSource] is not bound in this Context. Unable to find [jdbc].
at org.apache.naming.NamingContext.lookup(NamingContext.java:818)
at org.apache.naming.NamingContext.lookup(NamingContext.java:166)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:157)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:155)
at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87)
at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)
at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:179)
at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)
at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:106)
at org.springframework.jndi.JndiObjectTargetSource.afterPropertiesSet(JndiObjectTargetSource.java:97)
at org.springframework.jndi.JndiObjectFactoryBean$JndiObjectProxyFactory.createJndiObjectProxy(JndiObjectFactoryBean.java:318)
at org.springframework.jndi.JndiObjectFactoryBean$JndiObjectProxyFactory.access$000(JndiObjectFactoryBean.java:307)
at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:200)
at com.kronos.daas.configuration.TomcatJndiConfiguration.dataSource(TomcatJndiConfiguration.java:72)

已经在这里回答了:https://dev59.com/Ruo6XIcBkEYKwwoYJAvV#26005740 - nekperu15739
2个回答

2
您需要将JndiObjectFactoryBean上的lookupOnStartup设置为false。
或者,如果您需要在启动期间进行查找,则可能会对此答案感兴趣。 编辑:您还错误地在JndiObjectFactory bean上设置了JNDI名称。它需要是 java:comp / env / jdbc / myDataSource 而不是 jdbc / dataSource
当您查找资源时,您使用不同的名称,而当您将其注册时,注册自动将资源放置在 java:comp / env / 下方。

哎呀,还是没有运气。由于一些方法已经过时,我不得不修改几行代码。 获取ClassLoader:ClassUtils.overrideThreadContextClassLoader(context.getClass().getClassLoader());但我仍然收到了与上述相同的错误。你有什么想法吗? - shep519
在执行查找时,您使用了错误的JNDI名称。有关更多详细信息,请参见我的编辑。 - Andy Wilkinson
我也尝试过那个,但我认为这并不重要,如果我将setResourceRef设置为true,它应该自动附加“java:”字符串,但无论如何,我仍然收到相同的错误。 - shep519
请注意,Spring Boot 1.4中已经修复了启动期间查找的解决方法/黑客。 - dustin.schultz

-1
如果您正在使用Spring Boot,则无需所有这些类。它已经在@EnableAutoConfiguration或@SpringBootApplication中进行了配置。
只需将以下内容放入您的application.properties文件或等效的application.yml文件中即可:
spring.datasource.driverClassName=JDBCDriverClassName
spring.datasource.url=databaseUrl
spring.datasource.username=databaseUsername
spring.datasource.password=databasePassword
spring.datasource.jndi-name=java:jdbc/dataSource

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