복붙노트

[SPRING] 스프링 데이터 : 관리되지 않는 유형 : class java.lang.Object

SPRING

스프링 데이터 : 관리되지 않는 유형 : class java.lang.Object

저는 어제 스프링 데이터 프로젝트를 사용하기 시작했고 내가 만든 저장소에 테스트를 추가하려고했습니다.

프로젝트 구조는 다음과 같습니다.

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

ApplicationConfig는 다음과 같습니다.

@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는 다음과 같습니다.

import org.springframework.data.repository.Repository;

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

네트워크는 엔티티 클래스입니다.

@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;
...
}

BaseRepositoryTest는 다음과 같습니다.

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

내 pom.xml은 다음과 같습니다.

<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>

mvn 새로 설치를 실행하면 다음과 같은 오류가 나타납니다.

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

여기에서 내가 뭘 잘못하고 있는지 확인하도록 도와주세요. 나는이 프로젝트가 처음이다.

해결법

  1. ==============================

    1.저장소가 관리하는 유형은 부트 스트랩 시간에 알려 져야합니다. 즉, 실제로 다음과 같은 구체적인 저장소를 만들어야합니다.

    저장소가 관리하는 유형은 부트 스트랩 시간에 알려 져야합니다. 즉, 실제로 다음과 같은 구체적인 저장소를 만들어야합니다.

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

    당신이 보여준 코드에는 몇 가지 다른 결함이 있습니다.

  2. ==============================

    2.이것은 또 하나의 저장소 인터페이스가 다른 인터페이스를 확장하고 수퍼 인터페이스에서 @NoRepositoryBean을 잊어 버린 경우에도 발생합니다.

    이것은 또 하나의 저장소 인터페이스가 다른 인터페이스를 확장하고 수퍼 인터페이스에서 @NoRepositoryBean을 잊어 버린 경우에도 발생합니다.

  3. ==============================

    3.나는 같은 문제에 직면하고 @NoRepositoryBean을 추가하여 해결했다.

    나는 같은 문제에 직면하고 @NoRepositoryBean을 추가하여 해결했다.

    @NoRepositoryBean
    public interface BaseRespository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {}
    
  4. ==============================

    4.my.package 이름으로 인해 같은 오류가 발생했습니다. 올바른 패키지 이름을 제공하면 제대로 작동합니다.

    my.package 이름으로 인해 같은 오류가 발생했습니다. 올바른 패키지 이름을 제공하면 제대로 작동합니다.

    @EnableJpaRepositories ( 'my.package')

  5. ==============================

    5.다음 변경을 시도하십시오.

    다음 변경을 시도하십시오.

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

    6.나는 실수 아래에서 일하고 있었다.

    나는 실수 아래에서 일하고 있었다.

    공장을 만들 때 엔터티 패키지 대신 repo 패키지를 전달했습니다.

  7. ==============================

    7.모델 클래스에서 @Entity Annotation을 놓친 것 같습니다.

    모델 클래스에서 @Entity Annotation을 놓친 것 같습니다.

        @Entity
        class <classname>
        {
           //model variables   & getters Setters   
    
        }
    
  8. from https://stackoverflow.com/questions/23812458/spring-data-not-an-managed-type-class-java-lang-object by cc-by-sa and MIT license