首页 文章

在Spring Core Maven项目中使用Hibernate和H2数据库时出现不满意的依赖异常

提问于
浏览
-2

在上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException:在com.niit.shoppingcart.config.ApplicationContextConfig中定义名称为“categoryDAO”的bean时出错:通过方法'getCategoryDao'参数表示的不满意依赖关系0:在com.niit.shoppingcart.config.ApplicationContextConfig中定义名称为'sessionFactory'的bean创建错误:通过工厂方法进行Bean实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.hibernate.SessionFactory]:工厂方法'getSessionFactory'抛出异常;嵌套异常是java.lang.NoSuchMethodError:javax.persistence.Table.indexes()[Ljavax / persistence / Index ;;嵌套异常是org.springframework.beans.factory.BeanCreationException:在com.niit.shoppingcart.config.ApplicationContextConfig中定义了名为'sessionFactory'的bean时出错:通过工厂方法进行Bean实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.hibernate.SessionFactory]:工厂方法'getSessionFactory'抛出异常;嵌套异常是java.lang.NoSuchMethodError:javax.persistence.Table.indexes()[Ljavax / persistence / Index;线程“main”中的异常org.springframework.beans.factory.UnsatisfiedDependencyException:在com.niit.shoppingcart.config.ApplicationContextConfig中定义名称为“categoryDAO”的bean时出错:通过方法'getCategoryDao'参数表示的不满意依赖0:创建bean时出错在com.niit.shoppingcart.config.ApplicationContextConfig中定义名称'sessionFactory':通过工厂方法进行Bean实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.hibernate.SessionFactory]:工厂方法'getSessionFactory'抛出异常;嵌套异常是java.lang.NoSuchMethodError:javax.persistence.Table.indexes()[Ljavax / persistence / Index ;;嵌套异常是org.springframework.beans.factory.BeanCreationException:在com.niit.shoppingcart.config.ApplicationContextConfig中定义了名为'sessionFactory'的bean时出错:通过工厂方法进行Bean实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.hibernate.SessionFactory]:工厂方法'getSessionFactory'抛出异常;嵌套异常是java.lang.NoSuchMethodError:javax.persistence.Table.indexes()[Ljavax / persistence / Index;在Org.springframework.beans.factory 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)at org .springframework.beans.factory.support.DefaultSingletonBeanRegistry.getS ingleton(DefaultSingletonBeanRegistry.java:230)org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)位于org.springframework.context.support.AbstractApplicationContext的org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)的org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776) .refit(AbstractApplicationContext.java:541)at com.niit.shoppingcart.CategoryTest.main(CategoryTest.java:13)引起:org.springframework.beans.factory.BeanCreationException:在com中定义名为'sessionFactory'的bean时出错.niit.shoppingcart.config.ApplicationContextConfig:通过工厂方法的Bean实例化失败;嵌套异常是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的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) . 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)at org . springframework.beans.factory.support.AbstractBeanFactory.doGet位于org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:207)的org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)中的Bean(AbstractBeanFactory.java:302) org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1214)org.springframework.beans.factory.factory上的org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054) .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.SessionFa ctory]:工厂方法'getSessionFactory'抛出异常;嵌套异常是java.lang.NoSuchMethodError:javax.persistence.Table.indexes()[Ljavax / persistence / Index; org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)... 27更多引起: java.lang.NoSuchMethodError:javax.persistence.Table.indexes()[Ljavax / persistence / Index;在在org.hibernate.boot.model.source.internal.annotations org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:1106)在org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:774) .AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:245)位于org.hibernate.boot.model.process.spi.MetadataBuildingProcess的org.hibernate.boot.model.process.spi.MetadataBuildingProcess $ 1.processEntityHierarchies(MetadataBuildingProcess.java:222) . 在org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418)的org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)上完成(MetadataBuildingProcess.java:265)在org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87)在org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:691)在org.hibernate.cfg.Configuration.buildSessionFactory(Configura tion.java:723)org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:372)at com.niit.shoppingcart.config.ApplicationContextConfig.getSessionFactory(ApplicationContextConfig.java:56)at com.niit.shoppingcart .config.ApplicationContextConfig $$ EnhancerBySpringCGLIB $$ 449f4899.CGLIB $ getSessionFactory $ 1()at com.niit.shoppingcart.config.ApplicationContextConfig $$ EnhancerBySpringCGLIB $$ 449f4899 $$ FastClassBySpringCGLIB $$ 7c760c88.invoke()at org.springframework.cglib . 在com.niit.shoppingcart.config.ApplicationContextConfig $$ EnhancerBySpringCGLIB $$ 449f4899的org.springframework.context.annotation.ConfigurationClassEnhancer $ BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:356)上的proxy.MethodProxy.invokeSuper(MethodProxy.java:228) . 了getSessionFactory()在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在sun.reflect.DelegatingMetho dAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)位于org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)的java.lang.reflect.Method.invoke(Method.java:498)中 . 还有28个

This is ApplicationContextConfig.java file

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);
        }
    }

This is the java test file in which the exception is occurring

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");
        }
    }
}

1 回答

  • 0

    测试类并没有真正正确加载Spring Boot上下文 . 您所做的只是根据您正在扫描的包 com.niit.shoppingcart 加载bean . 如果你希望以你的方式"test"你的应用程序,我会建议像:

    @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();
        }
    }
    

相关问题