如何使用注释自动装配 RestTemplate

Posted

技术标签:

【中文标题】如何使用注释自动装配 RestTemplate【英文标题】:How to autowire RestTemplate using annotations 【发布时间】:2015-03-17 11:26:52 【问题描述】:

当我尝试自动装配 Spring RestTemplate 时,出现以下错误:

nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.web.client.RestTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.

在注释驱动的环境中使用 Spring 4。

我的 dispatcher servlet 配置如下:

<context:component-scan base-package="in.myproject" />
<mvc:default-servlet-handler />    
<mvc:annotation-driven />
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>

我尝试自动装配 RestTemplate 的班级如下:

@Service("httpService")
public class HttpServiceImpl implements HttpService 

@Autowired
private RestTemplate restTemplate;

@Override
public void sendUserId(String userId)

    MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
    map.add("userId", userId);
    map.add("secretKey", "kbhyutu7576465duyfy");

    restTemplate.postForObject("http://localhost:8081/api/user", map, null);


    

【问题讨论】:

您能否确认在您的 HttpServiceImpl 中您正在导入类 org.springframework.web.client.RestTemplate 而不是其他一些 RestTemplate 实现? 我导入同一个 org.springframework.web.client.RestTemplate 你的配置文件可能没有被读取,添加一些其他的bean,看看它是否在上下文中注册,如果没有你得到答案 我在 dispatcher-servlet.xml 中声明了 bean() 而不是 applicationContext.xml 现在它工作正常. 【参考方案1】:

如果未定义 RestTemplate,您将看到的错误

考虑定义一个 bean 类型 'org.springframework.web.client.RestTemplate' 在你的配置中。

没有符合条件的 bean 类型 [org.springframework.web.client.RestTemplate] 找到

如何通过注解定义RestTemplate

取决于您使用的技术以及哪些版本会影响您在 @Configuration 类中定义 RestTemplate 的方式。

没有 Spring Boot 的 Spring >= 4

只需定义一个@Bean

@Bean
public RestTemplate restTemplate() 
    return new RestTemplate();

Spring Boot

不用定义一个,Spring Boot会自动为你定义一个。

Spring Boot >= 1.4

Spring Boot 不再自动定义RestTemplate,而是定义RestTemplateBuilder,让您可以更好地控制创建的RestTemplate。您可以在您的@Bean 方法中注入RestTemplateBuilder 作为参数来创建RestTemplate

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) 
   // Do any additional configuration here
   return builder.build();

在课堂上使用它

@Autowired
private RestTemplate restTemplate;

@Inject
private RestTemplate restTemplate;

【讨论】:

问题是关于在类中自动装配 RestTemplate,因此无需将 bean 放入 @Configuration 带注释的类中。可以直接放在课堂上(见@eaykin 回答) 当然,您可以在@Component 类中声明它(毕竟,@Configuration@Component 的元注释)但@Configuration 是首选。见***.com/a/28002891/2429176 嗨,如果我的类是函数式接口的实现怎么办?如何让 restTemplate 对象自动装配?存在另一个函数会引发错误!【参考方案2】:

您可以将以下方法添加到您的类中,以提供 RestTemplate 的默认实现:

@Bean
public RestTemplate restTemplate() 
    return new RestTemplate();

【讨论】:

+1 表示你可以将其添加到类中,无需将其放在@Configuration 注释类中 我把它放在我的一个服务中,它说 bean 创建循环错误,所以我需要使用配置注释的另一种方式【参考方案3】:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateClient 
    @Bean
    public RestTemplate restTemplate() 
        return new RestTemplate();
    

【讨论】:

【参考方案4】:

如果您使用 Spring Boot 1.4.0 或更高版本作为注释驱动的基础,则 Spring 不提供单个自动配置的 RestTemplate bean。从他们的文档中:

https://docs.spring.io/spring-boot/docs/1.4.0.RELEASE/reference/html/boot-features-restclient.html

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

【讨论】:

【参考方案5】:

在扩展 RestTemplate 类的 RestTemplateSOMENAME 中添加 @Configuration 注释。

@Configuration         
public class RestTemplateClass extends RestTemplate 


然后在您的控制器类中,您可以使用 Autowired 注释,如下所示。

@Autowired   
RestTemplateClass restTemplate;

【讨论】:

如果您想提供多个休息模板,这实际上是一个有效的解决方案,每个模板的配置都不同。虽然,我会使用@Component 装饰而不是@Configuration,然后将每个实现作为@Configuration 中的bean 提供 我认为使用 RestTemplateBuilder 提供多个 RestTemplate bean 会更好【参考方案6】:
@Autowired
private RestOperations restTemplate;

您只能使用实现自动装配接口。

【讨论】:

RestOperations 是一个接口docs.spring.io/spring/docs/current/javadoc-api/org/… 他是这么说的。如果接口有一个实现,你可以自动装配它。 您确定它按原样工作吗?我收到此错误:注入点具有以下注释:-@org.springframework.beans.factory.annotation.Autowired(required=true) 操作:考虑定义“org.springframework.web.client.RestOperations”类型的 bean在你的配置中

以上是关于如何使用注释自动装配 RestTemplate的主要内容,如果未能解决你的问题,请参考以下文章

注入和资源以及自动装配注释

Spring 3.2注释自动装配多个构造函数

使用@SpringBootTest时如何在测试类中自动装配bean

Spring中@autowired注释的用途是啥。术语自动装配是啥意思[重复]

尽管有 @EnableJpaRepositories 注释,但 Spring JPA 未实现/自动装配存储库

依赖 jar 的类中的自动装配注释