首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring Boot、JNDI数据源、Tomcat

Spring Boot、JNDI数据源、Tomcat
EN

Stack Overflow用户
提问于 2015-09-15 23:02:51
回答 1查看 6.7K关注 0票数 1

我现在承认,几个月来,我断断续续地阅读了很多关于这方面的问题、答案和网站,试图创建一个带有JNDI DataSource的嵌入Tomcat (并且可以部署到真正的Tomcat)的Spring Boot应用程序。在一次又一次的失败之后,我开始认为这根本不可能,这只是一个大阴谋!

在我永远放弃之前的最后一次尝试中,我现在要问:*你实际上是如何让它工作的?

这是我目前所拥有的:我的主类:

代码语言:javascript
运行
复制
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class FinanceApplication {

  public static void main(String[] args) throws Exception {
    SpringApplication.run(FinanceApplication.class, args);
  }

  @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/finance");
            resource.setType(DataSource.class.getName());
            resource.setProperty("driverClassName", "com.mysql.jdbc.Driver");
            resource.setProperty("url", "jdbc:mysql://localhost:3306/finance");
            resource.setProperty("username", "xxxx");
            resource.setProperty("password", "yyyy");

            context.getNamingResources().addResource(resource);
        }
    };
  }

  @Bean(destroyMethod="")
  public DataSource jndiDataSource() throws IllegalArgumentException, NamingException {
    JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
    bean.setJndiName("java:comp/env/jdbc/finance");
    bean.setProxyInterface(DataSource.class);
    bean.setLookupOnStartup(false);
    bean.afterPropertiesSet();
    return (DataSource)bean.getObject();
  }
}

我的Servlet配置(基于java):

代码语言:javascript
运行
复制
public class ServletInitializer extends SpringBootServletInitializer {

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(FinanceApplication.class);
  }

}

我使用的是Maven,我的pom.xml基于this one

问题:

当我在Eclipse中运行它时,我得到了以下异常(切入正题):

代码语言:javascript
运行
复制
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]: Factory method 'entityManagerFactory' threw exception; nested exception is org.springframework.jndi.JndiLookupFailureException: JndiObjectTargetSource failed to obtain new target object; nested exception is javax.naming.NameNotFoundException: Name [comp/env/jdbc/finance] is not bound in this Context. Unable to find [comp].

当我使用Maven部署到一个独立的Tomcat实例时,我得到了这个异常:

代码语言:javascript
运行
复制
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]: Factory method 'entityManagerFactory' threw exception; nested exception is org.springframework.jndi.JndiLookupFailureException: JndiObjectTargetSource failed to obtain new target object; nested exception is 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
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1119)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1014)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956)
...
EN

回答 1

Stack Overflow用户

发布于 2015-09-16 23:48:08

问题根本不在我的应用程序中,而是在我的Tomcat配置中。多亏了对this question的公认答案,我发现我需要在Tomcat的context.xml中添加一个ResourceLink元素。我想知道为什么Tomcat JNDI HowTo没有提到它?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32589425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档