2016-04-29 29 views
0

Ich bin ein Frühlings-Noob und ich kämpfe mit ihm.Java Spring JPA Repository

Grundsätzlich vor meinem Server mit Frühling in Verbindung mit JPA entwickelt Start habe ich versucht, nur ein einfaches Beispiel zu starten, um zu diesem Rahmen zu gewöhnen. Es ist mir bereits gelungen, Spring mit einigen Frameworks wie Log4J, Swagger und anderen zu arbeiten. Jetzt versuche ich mit JPA zu arbeiten und es gibt einige Punkte, die ich herausfinden kann.

Ich habe ein paar Blogs gesehen, wie man damit entwickelt und aus allen Tausenden Optionen wähle ich mein Repository Interfece und extend Repository<T, ID>.

package com.example.model; 
@Entity 
public class Person { 

    @Id 
    public Integer id; 

    public String name; 

    public Person(){} 
} 

package com.example.repository; 
public interface PersonRepository extends Repository<Person, Integer> { 
    Collection<Person> findAll(); 
} 


package com.example.controller; 
@RestController 
public class PersonController { 

    @Autowired 
    private PersonRepository repo; 

    @RequestMapping(value = "/persons", method = RequestMethod.GET) 
    public Collection<Person> getAll() { 
     return repo.findAll(); 
    } 
} 

package com.example; 
@SpringBootApplication 
public class App { 
    public static void main(String[] args) { 
     SpringApplication.run(App.class, args); 
    } 
} 

Und ich habe auch die Datei application.properties: Sie können meinen Code unten sehen

spring.datasource.platform=postgres 
spring.datasource.url=jdbc:postgresql://localhost:5432/test_db 
spring.datasource.username=test 
spring.datasource.password=test 
spring.datasource.driver-class-name=org.postgresql.Driver 

Wenn ich den Server läuft ich die folgende Ausnahme erhalten setzen:

: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.repository.PersonRepository com.example.controllers.PersonController.repo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.repository.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: 
: Closing JPA EntityManagerFactory for persistence unit 'default' 
: Stopping service Tomcat 
: Application startup failed 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.repository.PersonRepository com.example.controllers.PersonController.repo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.repository.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

Ich habe ein Github Repository erstellt, um den Code here zu teilen.

Jede Ahnung, was mache ich falsch?

+0

Was sind die Pakete Ihrer Klassen? Ihr Repository wird nur automatisch erkannt, wenn es sich im gleichen oder in einem Unterpaket wie die App-Klasse befindet. – dunni

+0

@dunni Ich habe nur zur Vereinfachung entfernt, aber hier sind sie: Paket com.example.controllers; Paket com.example.entities; Paket com.example.repository; Paket com.example; –

+0

Angenommen, Sie haben alle Abhängigkeiten. In Ihrer App-Klasse können Sie dies unterhalb der @SpringBootApplication: @ComponentScan (basePackages = "com.example") setzen. Dann versuche es noch einmal. –

Antwort

1

Das erste, was hier ist, warum Sie die Basis-Interface Repository als dabei implementiert müssen, werden Sie nicht üblichen CRUD-Operationen haben. Für solche Operationen ist besser zu implementieren CrudRepository. Da Sie CrudRepository implementieren, müssen Sie keine findAll() -Methode definieren und viele bekannte andere finden Sie in doc erwähnt.

Wenn darüber hinaus @SpringBootApplication Frühling Boot verwenden Sie die Standardwerte. Wenn Sie die @SpringBootApplication definition sehen Sie das sehen:

Many Spring Boot developers always have their main class annotated with @Configuration, @EnableAutoConfiguration and @ComponentScan. Since these annotations are so frequently used together (especially if you follow the best practices above), Spring Boot provides a convenient @SpringBootApplication alternative.

The @SpringBootApplication annotation is equivalent to using @Configuration, @EnableAutoConfiguration and @ComponentScan with their default attributes: [...]

Das bedeutet, wenn mit Standardwerten für ComponentScan Ihre Pakete sturctures wie folgt shloud sein:

  1. com.example.model -> Ihre Entitäten
  2. com.example.repositoriy -> Ihre Repositories
  3. com.example.controller -> Controller
  4. com.example -> Hauptanwendung Klasse Hier

ist ein Beispiel für default project structure Die Hauptanwendungsklasse in höhere Level-Paket sollte dann die anderen. Es sei denn, Sie müssen den Speicherort des Pakets mit @ComponentScan angeben.

Wie Sie Anfänger mit dem Framework sind. Ich empfehle Ihnen, Klassendefinitionen immer in der offiziellen Dokumentation zu sehen.

UPDATE:

Hier ist ein Beispiel von einem meiner Feder Boot-Projekte sehen

enter image description here

Auch dieses spring guide für JPA

+0

Ich habe versucht, von CrudRepository zu erweitern und benannte die Pakete so um, dass sie denen entsprechen, die Sie verweisen, aber immer noch nicht funktioniert und die gleiche Ausnahme –

+0

Die Paketnamen sind nicht wichtig. Die Struktur ist. Die Hauptklasse der Anwendung sollte im Paket höher als die anderen sein. Siehe meine Bearbeitung –

+0

Ich teile den Code hier https://github.com/BrunoMNDantas/SpringJPA –

1

mit Anmerkungen versehen Sie Ihre Schnittstelle mit @Repository. Und wenn das nicht funktioniert, versuchen Sie @EnableJPARepositories zur Hauptklasse hinzuzufügen.

+1

Mit Repositories und EnableJpaRepositories habe ich eine andere Ausnahme. Exception konnte das Feld autowire nicht steuern: private com.example.repository.PersonRepository com.example.controllers.PersonController.repo; verschachtelte Ausnahme ist org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen der Bean mit dem Namen 'personRepository': Aufruf der init-Methode fehlgeschlagen; verschachtelte Ausnahme ist java.lang.NoClassDefFoundError: org/springframework/data/repository/query/QueryByExampleExecutor –

+0

Folgen Sie einfach diesem https://github.com/joshlong/bootiful-microservices/blob/master/bootiful-applications/reservation-service/ src/main/java/com/example/ReservationServiceApplication.java – chetank

0

Versuchen Sie, die @Repository Anmerkung zu Ihrem PersonRepository fügte hinzu, dass der Grund sein könnte es es nicht findet.

0

Sie benötigen PersonRepository Schnittstelle mit Anmerkungen versehen mit @Respository, andernfalls wird der Spring-Kontext es nicht erkennen oder eine Implementierung dafür erstellen.

Verwandte Themen