2016-07-21 119 views
0

我是Spring Boot的新手,我有一个简单的应用程序,它有一个控制器和一个Thymeleaf模板。Spring Boot`org.springframework.beans.factory.BeanCreationException:创建bean注入自动装配依赖项失败;

当应用程序启动时,为了查看是否一切正常,应该运行一个名为RepoTester的Spring ApplicationListener以检查服务类的方法。该服务类调用PersonRepository的方法,它简单地扩展了Spring的CrudRepository。但是我每次去尝试运行应用程序,它属于在给我的留言:

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

但我不明白为什么。

ApplicationListener类只是:

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

Person类只是:

public class Person { 

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

随着gettersetter为每个属性的方法。

的应用程序也有一个属性文件名为application.properties指定Derby数据库的使用方法:

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

服务类的代码很简单:

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

和存储库是:

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

我的Maven文件是:

http://maven.apache.org/xsd/maven-4.0.0.xsd“> 4.0.0 webapps.city2016.micro RegistrationSpringBootThymeleaf1 1.0-快照 罐
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> 

任何人都可以建议我在哪里错了?

回答

0

我尝试了所有已发布的答案,但没有成功,因此应用程序已通过手动编写的DAO类转换为Spring JDBC,并且完美地工作。

虽然有关JPA的任何建议都会受到欢迎。

0

你需要注释的人与JPA注释:

@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

不幸的是会出现同样的问题。 –

+0

你注释过所有的获得者吗?你是否也将EnableJpaRepositories放回配置文件? –

+0

即使实际变量的获取者本身被注释了,该项目仍然失败。 –

0

你可以在这里阅读所有要求: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-jpa-and-spring-data

或检查,你已经做了在本教程中提到的一切: http://spring.io/guides/gs/accessing-data-jpa/

特别检查您是否有:

  • 主类注释与@Entity
  • @Id和类型的泛型类型的存储库(整数)相匹配注释实体的主键注释@SpringBootApplication
  • 实体类。
  • 您的实体和存储库类位于主类或更低级别的包级别。
+0

使用'@ SpringBootApplication'注释的主类:是。使用'@ Entity'注释的实体类:是。主键... :是的。您的实体和存储库类:是的。而且这个可怜的应用程序仍然失败! –

相关问题