2014-05-22 21 views
7

Zacząłem używać wczoraj projektu spring-data i próbowałem dodać test do repozytorium, które utworzyłem.dane sprężyste: Nie jest to typ zarządzany: klasa java.lang.Object

Struktura projekt wygląda

persistence/pom.xml 
      src/main/java/ 
         ApplicationConfig 
         BaseRepository 
         Network 
      src/main/test/BaseRepositoryTest 

ApplicationConfig wygląda

@Configuration 
@ComponentScan 
@EnableJpaRepositories 
public class ApplicationConfig { 
    @Bean 
    public DataSource dataSource() { 
     final EmbeddedDatabaseBuilder embeddedDatabaseBuilder = new EmbeddedDatabaseBuilder(); 
     embeddedDatabaseBuilder.setType(EmbeddedDatabaseType.H2); 
     return embeddedDatabaseBuilder.build(); 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     final HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); 
     jpaVendorAdapter.setDatabase(Database.H2); 
     jpaVendorAdapter.setGenerateDdl(true); 

     final LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
     localContainerEntityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter); 
     localContainerEntityManagerFactoryBean.setPackagesToScan(getClass().getPackage().getName()); 
     localContainerEntityManagerFactoryBean.setDataSource(dataSource()); 

     return localContainerEntityManagerFactoryBean; 
    } 
} 

BaseRepository wygląda

import org.springframework.data.repository.Repository; 

public interface BaseRepository<T, ID extends Serializable> extends Repository<T, ID> { 
    List<T> findAll(); 
} 

The Network jest klasa Entity wygląda

@Entity 
public class Network extends com.org.comma.persistence.Entity { 
    private final long networkId; 

    private final String name; 

    private final boolean active; 

    private final DateTime createdAt; 

    private String createdBy; 

    private DateTime updatedAt; 

    private String updatedBy; 
... 
} 

i BaseRepositoryTest wygląda

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {ApplicationConfig.class, BaseRepository.class}) 
public class BaseRepositoryTest { 

    @Autowired 
    BaseRepository<Network, Long> baseRepository; 

    @Test 
    public void testAllNetworks() { 
     final List<Network> networks = baseRepository.findAll(); 
     assertTrue(networks.isEmpty()); 
    } 
} 

My pom.xml wygląda

<dependencies> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate.javax.persistence</groupId> 
     <artifactId>hibernate-jpa-2.0-api</artifactId> 
     <version>1.0.1.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>4.3.5.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-jpa</artifactId> 
     <version>1.6.0.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>joda-time</groupId> 
     <artifactId>joda-time</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.google.code.findbugs</groupId> 
     <artifactId>jsr305</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.h2database</groupId> 
     <artifactId>h2</artifactId> 
    </dependency> 
</dependencies> 

Kiedy biegnę mvn clean install widzę błąd jak

java.lang.IllegalStateException: Failed to load ApplicationContext 
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99) 
    at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:101) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:319) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:212) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) 
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) 
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'baseRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class java.lang.Object 

Proszę mi pomóc zidentyfikować co am Robię źle tutaj, jestem nowy do tego projektu

+0

Jednym z powodów, dla których wystąpił błąd "nie jest zarządzana klasa", był http://stackoverflow.com/a/33608400/2028821 – Ruraj

Odpowiedz

0

Spróbuj następującą zmianę

@ContextConfiguration(classes = {ApplicationConfig.class, BaseRepository.class}, loader=AnnotationConfigContextLoader.class) 
25

The typ repozytorium zarządza musi być znana w bootstrap czasie, co oznacza, że ​​trzeba rzeczywiście stworzyć konkretny repozytorium tak:

interface NetworkRepository extends BaseRepository<Network, Long> { … } 

Istnieje kilka innych usterki w kodzie pokazałeś:

  • Klasanie ma żadnej właściwości opatrzonej komentarzem: @Id
  • BaseRepository powinna nosić adnotację @NoRepositoryBean, aby wskazać, że w ogóle nie ma być utworzona instancja. Szczegółowe informacje znajdują się w reference documentation.
+0

Oliver, czy możesz mi pomóc z tym samym wyjątkiem? Przeprowadzam migrację do Spring Data, a moje repozytorium jest następujące: https://github.com/viniciuspires/reqlist/blob/master/src/main/java/org/reqlist/repository/ProjectRepository.java To jest mój entity: https: // github.com/viniciuspires/reqlist/blob/master/src/main/java/org/reqlist/entity/Project.java I to jest moja konfiguracja: https://github.com/viniciuspires/reqlist/blob/master/src/ main/resources/META-INF/ Otrzymuję 'java.lang.IllegalArgumentException: Not an managed type: class org.reqlist.entity.Project' przez cały czas. Możesz mi pomóc? – ViniciusPires

+0

@OliverGierke Mam podobne pytanie. Czy chcesz mi w tym pomóc? Oto link: http://stackoverflow.com/questions/34711860/unable-to-autowire-custom-userdetails/ – CodeMed

3

Wystąpił ten sam błąd z powodu my.package nazwa jest błędna. gdy podam poprawną nazwę pakietu, działa dobrze.

@EnableJpaRepositories („my.package”)

2

Dzieje się tak również, jeśli masz jeden interfejs repozytorium, które rozciąga się inny, a ty zapomniałeś @NoRepositoryBean na super-interfejs.