it-swarm.com.de

federdaten: Kein verwalteter Typ: Klasse Java.lang.Object

Ich habe gestern mit spring-data project angefangen und versuchte, das von mir erstellte Repository mit einem Test zu versehen.

Die Projektstruktur sieht so aus

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

Das ApplicationConfig sieht so aus

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

Das BaseRepository sieht so aus

import org.springframework.data.repository.Repository;

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

Die Network ist wie eine Entity-Klasse

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

und BaseRepositoryTest sieht aus wie

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

Mein pom.xml sieht so aus 

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

Wenn ich mvn clean install starte, sehe ich einen Fehler als 

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

Bitte helfen Sie mir herauszufinden, was ich hier falsch mache. Ich bin neu in diesem Projekt

11
daydreamer

Der Typ, den das Repository verwaltet, muss zum Zeitpunkt des Bootstraps bekannt sein. Das bedeutet, dass Sie ein konkretes Repository wie folgt erstellen müssen:

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

In dem Code, den Sie angezeigt haben, gibt es noch einige andere Störungen:

  • Die Network-Klasse hat keine Eigenschaft, die mit @Id versehen ist.
  • BaseRepository sollte eine @NoRepositoryBean-Anmerkung tragen, um anzuzeigen, dass sie überhaupt nicht instanziiert werden soll. Weitere Informationen finden Sie in der Dokumentation reference .
32
Oliver Drotbohm

Dies geschieht auch, wenn Sie eine Repository-Schnittstelle haben, die eine andere erweitert, und Sie @NoRepositoryBean auf der Super-Schnittstelle vergessen haben.

7
AixNPanes

Ich habe das gleiche Problem gesehen und durch Hinzufügen von @NoRepositoryBean behoben

@NoRepositoryBean
public interface BaseRespository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {}
5
buddha

Ich habe dieselbe Fehlermeldung wegen my.package Name ist falsch. Sobald ich den richtigen Paketnamen eingebe, funktioniert es einwandfrei.

@EnableJpaRepositories (' mein.Paket ')

3
Frank Fu

Ich denke, du fehlst @Entity Annotation in Model Class 

    @Entity
    class <classname>
    {
       //model variables   & getters Setters   

    }
0
Bharat Bhamare

Ein weiteres Problem könnte darin bestehen, dass Sie vergessen haben, Ihre Klasse mit @Entity Zu versehen, da Spring Boot dies als Not a managed type Ansieht.

Nachdem Sie Ihre Klasse mit Anmerkungen versehen haben, sollte dies funktionieren. Wenn Sie jedoch den folgenden Fehler erhalten:

Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]

Stellen Sie dann sicher, dass Ihre Klasse eine ID mit den folgenden Anmerkungen hat:

 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)

Ein anderes Szenario könnte sein, dass Spring Boot Ihr JPA- oder CrusRepository-Paket nicht erkennt. Stellen Sie sicher, dass Sie Ihre Hauptklasse mit den folgenden Anmerkungen versehen:

@EnableJpaRepositories("Your-Package-Name-That-Includes-Your-Repository")
0
Zeusox

Ich habe den folgenden Fehler gemacht:

Zum Zeitpunkt der Erstellung einer Fabrik habe ich das Repo-Paket anstelle des Entitätspakets übergeben.

Versuchen Sie die folgende Änderung

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