2016-09-11 2 views
0

Я пытаюсь настроить спящий режим на основе Java в базе данных базы данных и начать использовать его из теста, но когда загружаются бобы Hibernate, сбой приложения. Дело в том, если это упражнение для настройки простого обслуживания с операциями CRUD с использованием CrudRepository для нескольких классов и WRITENoSuchBeanDefinitionException: Не существует определяющего компонента типа JpaVendorAdapter для зависимостей

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.orm.jpa.JpaVendorAdapter] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ... 72 more

Связанные конфигурации и исходный код:

hibernate.properties

jdbc.driverClassName = org.hsqldb.jdbcDriver 
jdbc.url = jdbc:hsqldb:mem:press 
jdbc.username = user 
jdbc.password = 
hibernate.dialect=org.hibernate.dialect.HSQLDialect 
hibernate.show_sql = false 
hibernate.format_sql = false 

HibernateConfig.java - который не может загрузить

@Configuration 
@EnableTransactionManagement 
@PropertySource(value = { "classpath:hibernate.properties" }) 
public class HibernateConfig { 

    @Autowired 
    private Environment environment; 

    @Bean 
    public EntityManagerFactory entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) { 
     LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean(); 
     lef.setDataSource(dataSource); 
     lef.setJpaVendorAdapter(jpaVendorAdapter); 
     lef.setPackagesToScan("net.agilob.press.entity"); 
     return lef.getNativeEntityManagerFactory(); 
    } 

    @Bean 
    public LocalSessionFactoryBean sessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(dataSource()); 
     sessionFactory.setPackagesToScan(new String[] { "net.agilob.press.entity" }); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 
     return sessionFactory; 
    } 

    @Bean 
    public DataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName")); 
     dataSource.setUrl(environment.getRequiredProperty("jdbc.url")); 
     dataSource.setUsername(environment.getRequiredProperty("jdbc.username")); 
     dataSource.setPassword(environment.getRequiredProperty("jdbc.password")); 
     return dataSource; 
    } 

    private Properties hibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
     properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
     properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 
     properties.put("hibernate.hbm2ddl.auto", environment.getRequiredProperty("create-drop")); 

     return properties; 
    } 

    @Bean 
    @Autowired 
    public HibernateTemplate getHibernateTemplate(SessionFactory sessionFactory) { 
     HibernateTemplate hibernateTemplate = new HibernateTemplate(sessionFactory); 
     return hibernateTemplate; 
    } 

    @Bean 
    @Autowired 
    public HibernateTransactionManager transactionManager(SessionFactory s) { 
     HibernateTransactionManager txManager = new HibernateTransactionManager(); 
     txManager.setSessionFactory(s); 
     return txManager; 
    } 
} 

AppConfig.java - файл загружен в конфигурации для тестирования

@Configuration 
@ComponentScan(basePackages = "net.agilob.press.entity") 
@EnableJpaRepositories(basePackages = "net.agilob.press.entity.repository") 
@Import(HibernateConfig.class) 
public class AppConfig { 

    @Bean 
    public PostService getPostService() { 
     return new PostService(); 
    } 
} 

PostServiceTest.java - это один должен создать экземпляр (ы) сообщение, сохраните его в базу данных памяти и извлекать позже (просто чтобы посмотреть, работает):

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = AppConfig.class, loader = AnnotationConfigContextLoader.class) 
@Transactional 
public class PostDAOTest { 

    @Autowired 
    private PostService postService; 

    @Before 
    public void setUp() { 
     Post post = new Post(); 
     post.setContent("body"); 
     post.setDescription("description"); 
     post.setIntroduction("introduction"); 
     post.setTitle("title"); 
     post.setTitleBrowser("title browser"); 
     postRepository.save(post); 
    } 

    @Test 
    public void testList() { 
     // checks if spring wiring was correct 
     assertNotNull("Problem with spring beans", postRepository); 
     assertFalse(postRepository.findTop10ByTitleOrderByIdAsc().isEmpty()); 
    } 
} 

PostService:

@Service("postService") 
@Transactional 
public class PostService { 

    @Autowired 
    private PostRepository postRepository; 

... 
} 

PostRepository:

public interface PostRepository extends BaseRepository<Post, Long> { 
} 

Я попытался создать один больше @Beans аннотированный метод в HibernateConfig, который был Bulding экземпляр JpaVendorAdapter, но когда я запускаю тест был сбой с:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.persistence.EntityManager]: Factory method 'createSharedEntityManager' threw exception; nested exception is java.lang.NullPointerException at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ... 59 more Caused by: java.lang.NullPointerException at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.initProxyClassLoader(SharedEntityManagerCreator.java:199) at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.<init>(SharedEntityManagerCreator.java:191) at org.springframework.orm.jpa.SharedEntityManagerCreator.createSharedEntityManager(SharedEntityManagerCreator.java:163) at org.springframework.orm.jpa.SharedEntityManagerCreator.createSharedEntityManager(SharedEntityManagerCreator.java:120) at org.springframework.orm.jpa.SharedEntityManagerCreator.createSharedEntityManager(SharedEntityManagerCreator.java:92) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ... 60 more

мой pom.xml

поэтому я думаю, что что-то еще не так в настройке.

Любая помощь в проектировании и настройке в лучшем виде очень ценится.

+1

Включили ли вы зимуют-EntityManager в качестве одного из зависимостей в проекте ?? – skm

+0

@skm вопрос обновлен с моим pom.xml внизу, да, у меня оно есть. – agilob

+1

Создавая bean для entityManagerFactory, вам нужно установить vendorAdaptor через новый HibernateJpaVendorAdaptor(), вы это делаете? – skm

ответ

1

Для того, чтобы ваш EntityManagerFactory знать класс провайдера, а также JPA диалекте, вам необходимо установить jpaVendorAdaptor на вашем EntityManagerFactory боба.Это может быть сделано как

@Bean 
public JpaVendorAdapter jpaVendorAdapter() { 
    HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); 
    jpaVendorAdapter.setShowSql(true); 
    jpaVendorAdapter.setDatabase(Database.HSQL); 
    jpaVendorAdapter.setDatabasePlatform(MySQL5Dialect.class.getName()); 
    jpaVendorAdapter.setGenerateDdl(false); 
    return jpaVendorAdapter; 
} 

и вызывать этот метод внутри EntityManagerFactory следующим образом:

lef.setJpaVendorAdapter(jpaVendorAdapter()); 
0

Вы уверены, что имеете все необходимые зависимости?

Доступен ли HibernateJpaVendorAdapter на вашем пути к классу?

Попробуйте добавить зависимость:

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-orm</artifactId> 
    <version>4.3.2.RELEASE</version> 
</dependency> 
+0

У меня это, мой pom.xml: https://gitlab.com/snippets/25944 – agilob

+0

Доступен ли HibernateJpaVendorAdapter на вашем пути к классам? - да – agilob

Смежные вопросы

 Смежные вопросы