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
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:
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 .Dies geschieht auch, wenn Sie eine Repository-Schnittstelle haben, die eine andere erweitert, und Sie @NoRepositoryBean auf der Super-Schnittstelle vergessen haben.
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> {}
Ich habe dieselbe Fehlermeldung wegen my.package Name ist falsch. Sobald ich den richtigen Paketnamen eingebe, funktioniert es einwandfrei.
@EnableJpaRepositories (' mein.Paket ')
Ich denke, du fehlst @Entity Annotation in Model Class
@Entity
class <classname>
{
//model variables & getters Setters
}
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")
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)