2016-12-24 3 views
0

Ich bin neu im Frühjahr und jpa. Ich habe ähnliche Themen durchsucht und bin immer noch nicht in der Lage, mein Problem zu lösen. Ich habe versucht, mein EmployeeRepository (Imp) in meine Testdatei zu übertragen, aber es gibt immer null zurück ... Der gesamte Code befindet sich unter demselben Paket. Vielen Dank für Ihre Zeit.spring @Autowired ein Repository gibt null zurück

Eine andere Frage ist das, was ich benutze sollte (ich versucht hatte, beide ohne Glück)

@Autowired 
    private EmployeeRepositoryImp er; 

und

@Autowired 
    private EmployeeRepository er; 

Unten ist mein Code ...

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

Antwort

0

endlich das Problem gelöst. Um den JUNIT-Test auszuführen, müssen Sie @RunWith verwenden.

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

Und auch im AppConfig.java müssen die folgende Anmerkung haben:

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

schließlich scheint es, wie Hibernate OGM mit jparepository nicht gut funktioniert. noch studierend ...

+0

Wenn Sie Spring verwenden, empfehle ich Ihnen, [Spring Data Neo4j] (https://github.com/spring-projects/spring-data-neo4j) auszuprobieren. Es wird von den beiden Entwicklern hinter Neo4j und Spring unterstützt. – digx1

0

Sie benötigen keine konkrete Implementierung von EmployeeRepository. Kommentieren Sie diese Klasse und automaten Sie EmployeeRepository.

Auch Sie brauchen @Controller Annotation auf dem Test nicht.

+0

Danke. Ich habe Ihren Vorschlag versucht, aber es funktioniert immer noch nicht ... –

+0

EmployeeRepository ist null, weil spring nicht in der Lage ist, Dependency-Injection durchzuführen, was viele Gründe haben könnte, weil die Komponenten nicht alle Pakete scannen oder geschachtelte Abhängigkeiten fehlschlagen. Ich würde empfehlen, eine Maven-basierte Verzeichnisstruktur zu verwenden und SpringBootTest zu verwenden, um Ihre Repositories zu testen. –