如何使用注释自动装配 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(如果未定义 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的主要内容,如果未能解决你的问题,请参考以下文章
使用@SpringBootTest时如何在测试类中自动装配bean
Spring中@autowired注释的用途是啥。术语自动装配是啥意思[重复]