Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring引导,JNDI数据源,Tomcat_Java_Maven_Tomcat_Spring Boot_Jndi - Fatal编程技术网

Java Spring引导,JNDI数据源,Tomcat

Java Spring引导,JNDI数据源,Tomcat,java,maven,tomcat,spring-boot,jndi,Java,Maven,Tomcat,Spring Boot,Jndi,我现在承认,我已经断断续续地阅读了许多关于这个问题的问题、答案和网站几个月了,我试图创建一个带有嵌入式Tomcat(并可部署到实际的Tomcat)和JNDI数据源的Spring Boot应用程序。在多次失败之后,我开始认为这根本不可能,这只是一个大阴谋 在我永远放弃之前的最后一次尝试中,我现在要问:你到底是如何让它工作的 以下是我目前掌握的情况: 我的主要班级: @Configuration @ComponentScan @EnableAutoConfiguration public class

我现在承认,我已经断断续续地阅读了许多关于这个问题的问题、答案和网站几个月了,我试图创建一个带有嵌入式Tomcat(并可部署到实际的Tomcat)和JNDI数据源的Spring Boot应用程序。在多次失败之后,我开始认为这根本不可能,这只是一个大阴谋

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

以下是我目前掌握的情况: 我的主要班级:

@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):

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

问题是:

当我在Eclipse中运行它时,会出现以下异常(切题):

当我使用Maven部署到一个独立的Tomcat实例时,会出现以下异常:

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)
...

问题根本不在我的应用程序中,而是在我的Tomcat配置中。由于接受了的答案,我发现我需要向Tomcat的context.xml添加ResourceLink元素。我想知道为什么Tomcat JNDI HowTo没有提到它?

我以前没有在Spring Boot中使用过JNDI,所以我真的帮不上忙(很抱歉:(但我确实有一个问题。既然您使用的是嵌入式Tomcat,为什么要使用JNDI?为什么不使用标准的Spring引导约定来设置数据源?这将为您节省大量麻烦它应该通过嵌入式和单独的Tomcat实例工作。仍然没有找到答案。我认为这甚至不可能。我会的建议您使用Spring配置文件。当嵌入式配置文件处于活动状态时,数据源将根据属性文件进行配置。当启用经典配置文件时,您可以使用Spring Boot的JNDI自动配置。看看有没有任何示例说明您的代码最终是如何工作的?您可以共享您的上一个版本吗?Tks,事实上,它确实支持我在下面简要介绍:
Tomcat为整个服务器维护一个单独的全局资源名称空间。这些资源在$CATALINA_BASE/conf/server.xml元素中配置。您可以通过使用将这些资源包含在每个web应用程序上下文中来向web应用程序公开这些资源。
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].
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)
...