java - Spring Boot 中的循环依赖

标签 java spring-boot

我试图在我的 bootspring 项目中使用restTemplate,当我编译时出现如下错误:

There is a circular dependency between 4 beans in the application context:
- courseController (field com.example.service.CourseService com.example.controller.CourseController.courseDAO)
- courseServiceRest (field private com.example.dao.CourseDAO com.example.service.CourseServiceRest.courseDAO)
- courseDAOImpl (field private org.springframework.web.client.RestTemplate com.example.dao.CourseDAOImpl.restTemplate)
- studentDAOImpl (field private org.springframework.web.client.RestTemplate com.example.dao.StudentDAOImpl.restTemplate)
- restTemplate

下面是我的代码:

我想是因为我在StudenDAOImpl和CourseDAOImpl中有相同的@bean,因为如果我删除CourseDAOImpl编译成功,代码如下:

StudentDAOImpl 代码:

@Service
public class StudentDAOImpl implements StudentDAO
{
    @Autowired
    private RestTemplate restTemplate;

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
       return builder.build();
    }

    @Override
    public StudentModel selectStudent (String npm)
    {
        StudentModel student = restTemplate.getForObject(url+npm, StudentModel.class);
        return student;
    }

    @Override
    public List<StudentModel> selectAllStudents ()
    {
       return null;
    }

}

CourseDAOImpl 代码:

@Service
public class CourseDAOImpl implements CourseDAO {

    @Autowired
    private RestTemplate restTemplate;

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }

    @Override
    public CourseModel selectCourse(String id) {
        CourseModel course = restTemplate.getForObject(urlCourse+id, CourseModel.class);
        return course;
    }

    @Override
    public List<CourseModel> selectAllCourses() {   
        return null;    
    }
}

有答案吗?非常感谢。

最佳答案

问题出在您的 DAO 中,您应该删除 @Bean 配置,并让每个 DAO 的配置如下所示

@Service
public class StudentDAOImpl implements StudentDAO
{
    @Autowired
    private RestTemplate restTemplate;

    @Override
    public StudentModel selectStudent (String npm)
    {
        StudentModel student = restTemplate.getForObject(url+npm, StudentModel.class);
        return student;
    }

    @Override
    public List<StudentModel> selectAllStudents ()
    {
       return null;
    }

}

然后在配置 Bean 或入口点应用程序中,您可以添加restTemplate bean。例如这里是 Config.java 中的一个配置 Bean

@Configuration
public class Config {
     @Bean
     public RestTemplate restTemplate(RestTemplateBuilder builder) {
       return builder.build();
     }
}

关于java - Spring Boot 中的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43706287/

相关文章:

java - Libgdx 鼠标刚刚点击

java - 使用 Hibernate + MySQL 保存或更新多对多表

java - C程序在哪个线程中执行?

java - Spring boot应用程序-Tomcat部署-无法确定合适的驱动程序类

java - Spring boot 2.0.6 quartz 在 war 中缺少 org/springframework/scheduling/quartz/SpringBeanJobFactory

Java Socket/Serversocket WAN 连接

Java如何编写泛型

java - org.quartz.JobPersistenceException : Couldn't acquire next trigger: Unknown column 'SCHED_TIME' in 'field list'

spring-boot - 每个请求的 Jooq 配置

java - 在Kafka中为同一主题创建多个消费者组-Java