错误?

bejyjqdl  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(275)

我正在使用SpringBoot并尝试创建RESTAPI,但无法解决此错误:“无法自动连线。找不到'personservice'类型的bean。“
因此,在我的项目中,我有以下结构:

▼ com.example
  ▼ person
    ▼ controller
        PersonController (class)
    ► dao
    ► datasouurce
    ► model
    ▼ service
        PersonService (class)
  ► car
  CarApplication (Spring Boot runnable class)

我有一个只有“car”文件夹和carapplication的项目。class在“car”文件夹中,一切正常。现在我将person文件夹添加到项目中,并将carapplication.class上移一级,因为现在它必须同时处理“car”和“person”。但是自从这样做之后,personcontroller.class中出现了一个错误。
这是我的personservice.class:

package com.example.person.service;

import ...

public class PersonService {

    private final PersonDao personDao;

    public PersonService(@Qualifier("postgres") PersonDao personDao) {
         this.personDao = personDao;
    }

    public List<Person> getAllPersons() {
        return personDao.selectAllPersons();
    }

    public Optional<Person> getPersonById(UUID id) {
        return personDao.selectPersonById(id);
    }
}

这是carapplication.class:

package com.example;

import ...

@SpringBootApplication
@EnableScheduling
@EnableAdminServer
public class CarApplication {

    public static void main(String[] args) {
        SpringApplication.run(CarApplication.class, args);
    }
}

最后但并非最不重要的一点是,这是发生错误的personcontroller.class:

package com.example.person.controller;

import ...

@RequestMapping("api/person")
@RestController
public class PersonController {

    private final PersonService personService;

    @Autowired
    public PersonController(PersonService**personService**) {
        this.personService = personService;
    }

    @GetMapping
    public List<Person> getAllPersons() {
        return personService.getAllPersons();
    }

    @GetMapping(path = "{id}")
    public Person getPersonById(@PathVariable("id") UUID id) {
        return personService.getPersonById(id)
                .orElse(null);
    }
}

我在personcontroller.class中将抛出错误的变量用“**”括起来。
这是application.properties中的数据源属性:

spring.datasource.url=jdbc:postgresql://localhost:5432/persondb
spring.datasource.username=postgres
spring.datasource.password=password

我曾尝试使用@componentscan来指定应该扫描哪些Map以查找bean,但没有解决这个问题。而且它应该已经扫描了正确的文件,因为carapplication.class已经被上移。如果需要更多的信息请告诉我。
更新:我已经在personservice.class上面添加了@service,它实际上删除了personcontroller.class中eventservice变量的红色下划线。但当我运行carapplication时,它仍然显示:
创建名为“eventservice”的bean时出错,该bean在文件[c:…\com\capasystems\person\service\personservice.class]中定义:通过构造函数参数0表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.unsatifieddependencyException:创建名为“postgres”的bean时出错,该bean在文件[c:…\com\capasystems\person\dao\persondataaccessservice.class]中定义:通过构造函数参数0表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.beancreationexception:创建名为“flywayinitializer”的bean时出错,该bean在类路径资源[org/springframework/boot/autoconfigure/flyway/flywayautoconfiguration$flywayconfiguration.class]中定义:调用init方法失败;嵌套异常为java.lang.illegalargumentexception:需要datasource或datasourceclassname或jdbcurl。

shyt4zoc

shyt4zoc1#

你需要@service在你的person service类中排名第一

package com.example.person.service;

import ...

@Service
public class PersonService {

    private final PersonDao personDao;

    public PersonService(@Qualifier("postgres") PersonDao personDao) {
         this.personDao = personDao;
    }

    public List<Person> getAllPersons() {
        return personDao.selectAllPersons();
    }

    public Optional<Person> getPersonById(UUID id) {
        return personDao.selectPersonById(id);
    }
}
oiopk7p5

oiopk7p52#

你试过了吗 @ComponentScan ?

package aaa.bbb.ccc;

@SpringBootApplication
@EnableScheduling
@EnableAdminServer
@ComponentScan({ "aaa.bbb.ccc.*" })
public class Application {}

一定要有 @Repository 以及 @Service 适当的注解也要确保所有的包都在 aaa.bbb.ccc. 在大多数情况下,这种设置可以解决这类问题。
告诉我结果。

相关问题