【问题标题】:UnsatisfiedDependencyException when using Hibernate with H2 database in Spring Core Maven Project在 Spring Core Maven 项目中使用 Hibernate 和 H2 数据库时出现 UnsatisfiedDependencyException
【发布时间】:2016-12-24 23:41:24
【问题描述】:

上下文初始化期间遇到异常 - 取消 刷新尝试: org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名称为 'categoryDAO' 的 bean 时出错 com.niit.shoppingcart.config.ApplicationContextConfig:不满意 通过方法 'getCategoryDao' 参数 0 表示的依赖关系: 创建名称为“sessionFactory”的 bean 时在 com.niit.shoppingcart.config.ApplicationContextConfig:豆 通过工厂方法实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化[org.hibernate.SessionFactory]:工厂方法 'getSessionFactory' 抛出异常;嵌套异常是 java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;;嵌套的 例外是 org.springframework.beans.factory.BeanCreationException: 创建名称为“sessionFactory”的 bean 时在 com.niit.shoppingcart.config.ApplicationContextConfig:豆 通过工厂方法实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化[org.hibernate.SessionFactory]:工厂方法 'getSessionFactory' 抛出异常;嵌套异常是 java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;例外 在线程“主”中 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名称为 'categoryDAO' 的 bean 时出错 com.niit.shoppingcart.config.ApplicationContextConfig:不满意 通过方法 'getCategoryDao' 参数 0 表示的依赖关系: 创建名称为“sessionFactory”的 bean 时在 com.niit.shoppingcart.config.ApplicationContextConfig:豆 通过工厂方法实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化[org.hibernate.SessionFactory]:工厂方法 'getSessionFactory' 抛出异常;嵌套异常是 java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;;嵌套的 例外是 org.springframework.beans.factory.BeanCreationException: 创建名称为“sessionFactory”的 bean 时在 com.niit.shoppingcart.config.ApplicationContextConfig:豆 通过工厂方法实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化[org.hibernate.SessionFactory]:工厂方法 'getSessionFactory' 抛出异常;嵌套异常是 java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:467) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) 在 com.niit.shoppingcart.CategoryTest.main(CategoryTest.java:13) 引起:org.springframework.beans.factory.BeanCreationException: 创建名称为“sessionFactory”的 bean 时在 com.niit.shoppingcart.config.ApplicationContextConfig:豆 通过工厂方法实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化[org.hibernate.SessionFactory]:工厂方法 'getSessionFactory' 抛出异常;嵌套异常是 java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) 在 org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:207) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1214) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019) 在 org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835) 在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ... 13 更多原因: org.springframework.beans.BeanInstantiationException:失败 实例化[org.hibernate.SessionFactory]:工厂方法 'getSessionFactory' 抛出异常;嵌套异常是 java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ... 27 更多原因:java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;在 org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:1106) 在 org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:774) 在 org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:245) 在 org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:222) 在 org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:265) 在 org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83) 在 org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418) 在 org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:691) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:723) 在 org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:372) 在 com.niit.shoppingcart.config.ApplicationContextConfig.getSessionFactory(ApplicationContextConfig.java:56) 在 com.niit.shoppingcart.config.ApplicationContextConfig$$EnhancerBySpringCGLIB$$449f4899.CGLIB$getSessionFactory$1() 在 com.niit.shoppingcart.config.ApplicationContextConfig$$EnhancerBySpringCGLIB$$449f4899$$FastClassBySpringCGLIB$$7c760c88.invoke() 在 org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) 在 org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:356) 在 com.niit.shoppingcart.config.ApplicationContextConfig$$EnhancerBySpringCGLIB$$449f4899.getSessionFactory() 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ... 28 更多

这是 ApplicationContextConfig.java 文件

 package com.niit.shoppingcart.config;

    import java.util.Properties;

    import javax.sql.DataSource;

    import org.apache.commons.dbcp2.BasicDataSource;
    import org.hibernate.SessionFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.orm.hibernate4.HibernateTransactionManager;
    import org.springframework.orm.hibernate4.LocalSessionFactoryBuilder;
    import org.springframework.transaction.annotation.EnableTransactionManagement;


    import com.niit.shoppingcart.dao.CategoryDAO;
    import com.niit.shoppingcart.dao.CategoryDAOImpl;
    import com.niit.shoppingcart.model.Category;
    import com.niit.shoppingcart.model.Product;
    import com.niit.shoppingcart.model.Supplier;
    import com.niit.shoppingcart.model.UserDetails;


    @Configuration
    @ComponentScan("com.niit.shoppingcart")
    @EnableTransactionManagement
    public class ApplicationContextConfig {

        @Bean(name = "dataSource")
        public DataSource getDataSource() {
            BasicDataSource dataSource = new BasicDataSource();
            dataSource.setDriverClassName("org.h2.Driver");
            dataSource.setUrl("jdbc:h2:tcp://localhost/~/test");
            dataSource.setUsername("sa");
            dataSource.setPassword("");

            return dataSource;
        }


        private Properties getHibernateProperties() {
            Properties properties = new Properties();
            properties.put("hibernate.hbm2ddl.auto","update");
            properties.put("hibernate.show_sql", "true");
            properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
            return properties;
        }

        @Autowired
        @Bean(name = "sessionFactory")
        public SessionFactory getSessionFactory(DataSource dataSource) {
            LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
            sessionBuilder.addProperties(getHibernateProperties());
            sessionBuilder.addAnnotatedClasses(Category.class);
            sessionBuilder.addAnnotatedClasses(Supplier.class);
            sessionBuilder.addAnnotatedClasses(UserDetails.class);
            sessionBuilder.addAnnotatedClasses(Product.class);
            return sessionBuilder.buildSessionFactory();
        }

        @Autowired
        @Bean(name = "transactionManager")
        public HibernateTransactionManager getTransactionManager(
                SessionFactory sessionFactory) {
            HibernateTransactionManager transactionManager = new HibernateTransactionManager(
                    sessionFactory);

            return transactionManager;
        }

        @Autowired
        @Bean(name = "categoryDAO")
        public CategoryDAO getCategorDAO(SessionFactory sessionFactory) {
            return new CategoryDAOImpl(sessionFactory);
        }
    }

这是发生异常的 java 测试文件

package com.niit.shoppingcart;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.niit.shoppingcart.dao.CategoryDAO;
import com.niit.shoppingcart.model.Category;

public class CategoryTest {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();
        context.scan("com.niit.shoppingcart");
        context.refresh();
        CategoryDAO categoryDAO = (CategoryDAO) context.getBean("categoryDAO");

        Category category = (Category) context.getBean("category");

        category.setC_id("cg1234");
        category.setC_name("phone");
        category.setC_desc("This is the first category");

        if (categoryDAO.save(category) == true) {
            System.out.println("Category created");
        } else {
            System.out.println("Unable to create category");
        }
    }
}

【问题讨论】:

    标签: java spring hibernate h2


    【解决方案1】:

    测试类并没有真正正确地加载 Spring Boot 上下文。您所做的只是根据您正在扫描的包(com.niit.shoppingcart)加载 bean。如果您想以自己的方式“测试”您的应用程序,我建议您这样做:

    @SpringBootApplication
    public class TestApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(TestApplication.class, args);
        }
    
        @Component
        public class CategoryTest implements ApplicationRunner {
            private CategoryDAO categoryDAO;
    
            // Spring Boot 1.4 autowires on constructors automatically
            public CategoryTest(CategoryDAO categoryDAO) {
                this.categoryDAO= categoryDAO;
            }
    
            public void run(String[] args) {
                // This doesn't need to be a bean as it is just a pojo state object
                Category category = new Category();
                category.setC_id("cg1234");
                category.setC_name("phone");
                category.setC_desc("This is the first category");
    
                if (categoryDAO.save(category) == true) {
                    System.out.println("Category created");
                } else {
                    System.out.println("Unable to create category");
                }
            }
        }
    }
    

    更好的方法是使用 JUnit 进行测试。下面是代码在 JUnit 测试中的样子:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class CategoryTest {
        @Autowired
        private CategoryDAO categoryDAO;
    
        @Test
        public testSave() {
            Category category = new Category();
            category.setC_id("cg1234");
            category.setC_name("phone");
            category.setC_desc("This is the first category");
    
            assertThat(categoryDAO.save(category)).isTrue();
        }
    }
    

    【讨论】:

    • 谢谢。我试过了,但它在运行时抛出了相同的异常和更多异常。
    猜你喜欢
    • 2013-05-01
    • 2018-05-09
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2014-12-19
    相关资源
    最近更新 更多