2016-12-24 6 views
0

Я новичок в весне и jpa. Я искал похожие темы и до сих пор не могу решить свою проблему. Я попытался autowire мой EmployeeRepository (Imp) в моем тестовом файле, но он всегда возвращает null ... Весь код находится под одним и тем же пакетом. Большое спасибо за ваше время.spring @Autowired репозиторий возвращает null

Другой вопрос заключается в том, что один, который я должен использовать (я пробовал и без везения)

@Autowired 
    private EmployeeRepositoryImp er; 

и

@Autowired 
    private EmployeeRepository er; 

Ниже приведен мой код ...

package com.rw.examples.hibernate_ogm_neo4j; 

    import javax.persistence.EntityManager; 
    import javax.persistence.EntityManagerFactory; 
    import javax.persistence.Persistence; 

    import org.springframework.context.annotation.Bean; 
    import org.springframework.context.annotation.Configuration; 

    @Configuration 
    public class AppConfig { 

     @Bean 
     public EntityManager entityManager() { 
      return entityManagerFactory().createEntityManager(); 
     } 

     @Bean 
     public EntityManagerFactory entityManagerFactory() { 
      return Persistence.createEntityManagerFactory("ogm-neo4j"); 
     } 

    } 



    package com.rw.examples.hibernate_ogm_neo4j; 

    import org.springframework.data.jpa.repository.JpaRepository; 
    import org.springframework.stereotype.Repository; 

    @Repository 
    public interface EmployeeRepository extends JpaRepository<Employee, Long>{ 

    } 




    package com.rw.examples.hibernate_ogm_neo4j; 

    import javax.persistence.EntityManager; 

    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.data.jpa.repository.support.SimpleJpaRepository; 
    import org.springframework.stereotype.Repository; 

    @Repository 
    public class EmployeeRepositoryImp extends SimpleJpaRepository<Employee, Long> implements EmployeeRepository{ 

     private EntityManager entityManager; 

     @Autowired 
     public EmployeeRepositoryImp(Class<Employee> domainClass, EntityManager em) { 
      super(domainClass, em); 
      // TODO Auto-generated constructor stub 
      this.entityManager = em; 
     } 
    } 



    package com.rw.examples.hibernate_ogm_neo4j; 

    import javax.persistence.EntityManager; 
    import javax.persistence.EntityManagerFactory; 

    import org.junit.Test; 
    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.context.ApplicationContext; 
    import org.springframework.context.annotation.AnnotationConfigApplicationContext; 
    import org.springframework.context.annotation.ComponentScan; 
    import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 
    import org.springframework.stereotype.Controller; 

    @Controller 
    @EnableJpaRepositories (basePackages = {"com.rw.examples.hibernate_ogm_neo4j"}) 
    @ComponentScan(basePackages = {"com.rw.examples.hibernate_ogm_neo4j"}) 
    public class RepositoryTest { 


    @Autowired 
    private EmployeeRepositoryImp er; 

    @Test 
    public void testRepository() { 

     ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); 

     EntityManagerFactory emf = ctx.getBean(EntityManagerFactory.class); 
     EntityManager em = emf.createEntityManager(); 


     System.out.println("testRepository"); 
     er.save(new Employee("Frank")); 
     System.out.println("list employees using repository"); 
     Iterable<Employee> employees = er.findAll(); 
     employees.forEach(e->System.out.println(e.toString())); 
    } 
} 

ответ

0

окончательно решил проблему. Для запуска теста JUNIT необходимо использовать @RunWith.

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

А также в AppConfig.java должен иметь следующую аннотацию:

@Configuration 
@EnableJpaRepositories 
public class AppConfig {...} 

наконец, кажется, как спящее OGM не очень хорошо работает с jparepository. все еще изучая ...

+0

Если вы используете Spring, я рекомендую вам попробовать [Spring Data Neo4j] (https://github.com/spring-projects/spring-data-neo4j). Он поддерживается обоими разработчиками Neo4j и Spring. – digx1

0

Вам не нужна конкретная реализация EmployeeRepository. Прокомментируйте этот класс и autwire EmployeeRepository.

Также вам не нужна аннотация @Controller на тесте.

+0

Спасибо. Я попробовал ваше предложение, но он все еще не работает ... –

+0

EmployeeRepository имеет значение null, потому что весна неспособна выполнить инъекцию зависимостей, что может быть много причин из-за сканирования компонентов, не сканируя все пакеты или вложенные зависимости. Я бы рекомендовал использовать структуру каталогов на основе maven и использовать SpringBootTest для проверки ваших репозиториев. –

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