首页 > 解决方案 > org.springframework.web.client.RestTemplate 期望被声明为@Bean 和普通的@Autowired 抛出错误

问题描述

我在我的@RestController类“personController”中需要一个 RestTemplate 对象,所以我像下面这样声明它。

@Autowired
 private RestTemplate restTemplate;

当我尝试使用它时,我得到以下错误 com.example.demo.api.PersonController 中的字段 restTemplate 需要一个org.springframework.web.client.RestTemplate找不到类型的 bean。考虑在配置中定义一个 bean 类型org.springframework.web.client.RestTemplate

为了克服这个错误,我@Bean在 config.java 文件中声明了一个像下面这样的 for restemplate,它工作正常并且没有抛出任何错误。

@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate;
}

我在“personService”类中使用一个com.fasterxml.jackson.databind.ObjectMapper对象,我像下面这样自动连接它。@Service

@Autowired
private ObjectMapper objectMapper;

我能够使用 objectmapper 而不为它声明任何 bean 并且它工作正常。我想明白

  1. 为什么 objectmapper 在没有 bean 的情况下工作,但 resttemplate 在没有 bean 的情况下无法工作并期望声明一个 bean?
  2. 什么时候创建一个bean,什么时候简单地使用plain @Autowiredwithout bean?我怎样才能通过查看它来找到它?

标签: javaspringrestspring-bootspring-mvc

解决方案


正如春季文档中提到的那样。 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-resttemplate.html

如果需要从应用程序调用远程 REST 服务,可以使用 Spring Framework 的 RestTemplate 类。由于 RestTemplate 实例通常需要在使用前进行自定义,因此 Spring Boot 不提供任何单个自动配置的 RestTemplate bean。但是,它确实会自动配置一个 RestTemplateBuilder,它可用于在需要时创建 RestTemplate 实例。自动配置的 RestTemplateBuilder 确保将合理的 HttpMessageConverters 应用于 RestTemplate 实例。


推荐阅读