【问题标题】:Spring Boot `org.springframework.beans.factory.BeanCreationException: Error creating bean Injection of autowired dependencies failed;Spring Boot`org.springframework.beans.factory.BeanCreationException:创建自动装配依赖的bean注入失败;
【发布时间】:2016-07-21 22:42:35
【问题描述】:

我是 Spring Boot 新手,我有一个简单的应用程序,它有一个控制器和一个 Thymeleaf 模板。

当应用程序启动时,为了查看是否一切正常,应该运行一个名为 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("c.laithwaite@collosus.net");
    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 注册SpringBootThymeleaf1 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>

谁能告诉我哪里错了?

【问题讨论】:

    标签: java spring-boot thymeleaf autowired


    【解决方案1】:

    我尝试了发布的两个答案,但均未成功,因此应用程序已通过手动编写的 DAO 类转换为 Spring JDBC,并且运行良好。

    欢迎任何有关 JPA 的建议。

    【讨论】:

      【解决方案2】:

      你需要用JPA注解来注解Person:

      @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() { ... }
      

      【讨论】:

      • 不幸出现同样的问题。
      • 你注释了所有的 getter 吗?您是否也将 EnableJpaRepositories 放回了配置文件?
      • 即使对实际变量的getter本身进行了注释,项目仍然失败。
      • 很遗憾,我不能发布它。
      • 我想我不能再帮忙了:(
      【解决方案3】:

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

      或者检查您是否已完成本教程中提到的所有操作: http://spring.io/guides/gs/accessing-data-jpa/

      特别检查您是否拥有:

      • @SpringBootApplication注释的主类
      • @Entity注解的实体类
      • @Id 注释的实体上的主键,并且类型与您的存储库的泛型类型匹配(整数)。
      • 您的实体和存储库类位于主类的包级别或以下。

      【讨论】:

      • @SpringBootApplication注释的主类:是的。用@Entity注解的实体类:是的。主键...:是的。您的实体和存储库类:是的。但可怜的应用程序仍然失败!
      猜你喜欢
      • 2018-11-01
      • 2015-05-28
      • 1970-01-01
      • 2015-08-31
      • 2015-05-25
      • 2015-08-07
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多