2016-07-21 12 views
0

Ich bin ein Spring Boot Neuling und ich habe eine einfache Anwendung, die einen Controller und eine Thymeleaf Vorlage hat.Spring Boot `org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen der Bean Injection der Abhängigkeiten mit Autowired fehlgeschlagen;

Wenn die Anwendung gestartet wird, um zu sehen, ob alles funktioniert, sollte ein Spring ApplicationListener namens RepoTester ausgeführt werden, um die Methoden einer Serviceklasse zu überprüfen. Die Serviceklasse ruft Methoden der PersonRepository auf, die einfach Spring's CrudRepository verlängert. Aber jedes Mal, wenn ich gehe, um zu versuchen, die Anwendung ausgeführt wird, es fällt über mir die Nachricht geben:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repoTester': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private webapps.city2016.micro.code.service.PersonService webapps.city2016.micro.code.bootstrap.RepoTester.personService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private webapps.city2016.micro.code.repo.PersonRepository webapps.city2016.micro.code.service.PersonServiceImpl.personRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [webapps.city2016.micro.code.repo.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)}

Aber ich kann nicht sehen, warum.

Die ApplicationListener Klasse ist einfach:

@Component 
public class RepoTester implements ApplicationListener<ContextRefreshedEvent> { 

@Autowired 
private PersonService personService; 

private static final Logger logger = Logger.getLogger(RepoTester.class); 

@Override 
public void onApplicationEvent(ContextRefreshedEvent event) { 
    logger.info(RepoTester.class.getName() + ".onApplicationEvent() method called."); 

    // Create Person. 
    Person person = new Person(); 
    person.setName("Cleo Markham"); 
    person.setAddress("48 Alysbury Road"); 
    person.setTelephone("34561287"); 
    person.setEmail("[email protected]"); 
    person = personService.save(person);   

Die Person Klasse ist einfach:

public class Person { 

    // Attributes.  
    private Integer personId; 
    private String name; 
    private String address; 
    private String telephone; 
    private String email; 

Mit getter und setter Methoden für jedes Attribut.

Die Anwendung verfügt auch über eine Eigenschaften application.properties Angabe der Derby-Datenbank namens Datei zu verwenden: einfach

spring.datasource.driverClassName=org.apache.derby.jdbc.ClientDriver 
spring.datasource.url=jdbc:derby://localhost:1527/Library 
spring.datasource.username=username 
spring.datasource.password=password 

Der Code der Dienstklasse:

@Service() 
public class PersonServiceImpl implements PersonService { 

    @Autowired 
    private PersonRepository personRepository; 

    private static final Logger logger = Logger.getLogger(PersonServiceImpl.class); 

    public PersonServiceImpl() { 
    } 

    @Override 
    public void delete(Integer personId) { 
     logger.info(PersonServiceImpl.class.getName() + ".delete() method called."); 

     personRepository.delete(personId); 
    } 

    @Override 
    public boolean exists(Integer personId) { 
     logger.info(PersonServiceImpl.class.getName() + ".exists() method called."); 

     return personRepository.exists(personId); 
    } 

    @Override 
    public Person findOne(Integer personId) { 
     logger.info(PersonServiceImpl.class.getName() + ".findOne() method called."); 

     return personRepository.findOne(personId); 
    } 

    @Override 
    public Iterable<Person> findAll() { 
     logger.info(PersonServiceImpl.class.getName() + ".findAll() method called."); 

     return personRepository.findAll(); 
    } 

    @Override 
    public Person save(Person person) { 
     logger.info(PersonServiceImpl.class.getName() + ".save() method called."); 

     return personRepository.save(person); 
    }  

Und das Repository:

package webapps.city2016.micro.code.repo; 

import org.springframework.data.repository.CrudRepository; 

import webapps.city2016.micro.code.model.Person; 

public interface PersonRepository extends CrudRepository<Person, Integer> { 
} 

Meine Maven-Datei ist:

http://maven.apache.org/xsd/maven-4.0.0.xsd "> 4.0.0 webapps.city2016.micro RegistrationSpringBootThymeleaf1 1,0-snapshot jar
UTF-8 1,8 1,8

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.3.5.RELEASE</version> 
    <relativePath /> 
</parent> 

<dependencies> 
    <dependency> 
     <groupId>org.apache.derby</groupId> 
     <artifactId>derbyclient</artifactId> 
     <version>10.12.1.1</version> 
    </dependency>  
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-jdbc</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-thymeleaf</artifactId> 
    </dependency>      
</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
     </plugin> 
    </plugins> 
</build> 

<name>RegistrationSpringBootThymeleaf1</name> 

Kann jemand raten, wo ich falsch bin?

Antwort

0

Ich habe versucht beide Antworten geschrieben, aber ohne Erfolg, so dass die Anwendung auf Spring JDBC mit einer manuell geschriebenen DAO-Klasse konvertiert wurde und es funktioniert perfekt.

Jeder Rat bezüglich JPA wäre jedoch willkommen.

0

Sie benötigen Person mit JPA-Annotation zu annotieren:

@Entity 
@Table(name = "person") 
public class Person { 

    // Attributes.  
    private Integer personId; 
    private String name; 
    private String address; 
    private String telephone; 
    private String email; 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public Integer getPersonId() { ... } 

    @Basic 
    @Column(name = "name") 
    public String getName() { ... } 
+0

Das gleiche Problem tritt leider auf. –

+0

Haben Sie alle Getter kommentiert? Haben Sie die EnableJpaRepositories auch wieder in die Konfigurationsdatei aufgenommen? –

+0

Auch wenn die Getter der eigentlichen Variablen selbst kommentiert sind, schlägt das Projekt immer noch fehl. –

0

Sie können hier alle Anforderungen lesen: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-jpa-and-spring-data

Oder schauen Sie, dass Sie alles getan haben, was in diesem Tutorial erwähnt wird: http://spring.io/guides/gs/accessing-data-jpa/

Insbesondere überprüfen Sie, ob Sie haben:

  • Hauptklasse mit mit @Entity
  • Der Primärschlüssel auf der Einheit mit @Id kommentierte kommentierte @SpringBootApplication
  • Entity Klasse kommentiert und dass der Typ entspricht dem Generika Typ Ihres Repository (Integer).
  • Ihre Entitäts- und Repository-Klassen sind auf der Paketebene der Hauptklasse oder darunter.
+0

Haupt-Klasse mit '@ SpringBootApplication' kommentiert: Ja. Entity-Klasse mit' @ Entity': Ja. Der Primärschlüssel ... : Ja, Ihre Entitäts- und Repository-Klassen: Ja. Und die elende Anwendung schlägt immer noch fehl! –