java - Spring Actuator:使用多个自定义 RestTemplateBuilder bean 配置 CloudFoundryActuator 时出错
问题描述
我们在 java @Configuration 注释类中配置两个单独的 RestTemplateBuilder bean,如下所示:
@Bean("internal_api")
public RestTemplateBuilder internalRestTemplateBuilder(@Autowired
OAuthConsumerOperations oAuthConsumerOperations) {
...
}
@Bean("external_api")
public RestTemplateBuilder externalRestTemplateBuilder(){
...
}
当我们将应用程序部署到 Pivotal Cloud Foundry Apps Manager 时,我们会收到以下错误。当它只期望一个时,它抱怨发现了多个 RestTemplateBuilder bean。
在 URL [jar:file:/home/vcap/app/BOOT-INF/lib/springfox-spring-web-2.7.0.jar!/springfox/documentation/spring/web/ 中定义名称为“webMvcRequestHandlerProvider”的 bean 创建错误plugins/WebMvcRequestHandlerProvider.class]:通过构造函数参数0表示的不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:在类路径资源 [org/springframework/boot/actuate/cloudfoundry/CloudFoundryActuatorAutoConfiguration.class] 中定义的名称为“cloudFoundryEndpointHandlerMapping”的 bean 创建时出错:通过方法“cloudFoundryEndpointHandlerMapping”表示不满足的依赖关系参数1;嵌套异常是 org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.boot.web.client.
这是一个错误吗?在 Cloud Foundry 上使用 spring actuator 时,您是否都不允许配置多个 RestTemplateBuilder bean?有没有办法解决这个错误?如果没有,创建 RestTemplate bean 而不是 RestTemplateBuilders 会起作用吗?如果是这种情况,那么 CloudFoundryActuatorAutoConfiguration 类在部署到 Cloud Foundry 时是否需要至少定义一个 RestTemplateBuilder bean?
解决方案
我的 0.02 美元,但我认为您不应该创建 RestTemplateBuilder 实例。RestTemplateBuilder 的文档说:
在典型的自动配置 Spring Boot 应用程序中,此构建器可作为 bean 使用,并且可以在需要 RestTemplate 时注入。
最好你的应用程序可以是“典型的”,除非有充分的理由,否则我不会偏离这一点。所以我认为你想做这样的事情:
// this is created & injected by Spring Boot
@Autowired
private RestTemplateBuilder restTemplateBuilder;
@Bean("internal_api")
public RestTemplate internalRestTemplate(@Autowired OAuthConsumerOperations oAuthConsumerOperations) {
return restTemplateBuilder.build(); // add additional config
}
@Bean("external_api")
public RestTemplate externalRestTemplate(){
return restTemplateBuilder.build(); // add additional config
}
具体解决您的问题:
这是一个错误吗?在 Cloud Foundry 上使用 spring actuator 时,您是否都不允许配置多个 RestTemplateBuilder bean?有没有办法解决这个错误?
我不能明确地说,但似乎 Actuator 有一个前提条件,即只存在一个。它应该/可以支持多个案例吗?也许吧,但目前似乎没有这样做。
如果没有,创建 RestTemplate bean 而不是 RestTemplateBuilders 会起作用吗?
我相信这是要走的路,见上文。
如果是这种情况,那么 CloudFoundryActuatorAutoConfiguration 类在部署到 Cloud Foundry 时是否需要至少定义一个 RestTemplateBuilder bean?
不,看起来 Spring Boot 会为您定义一个。虽然,如果您需要,您可以覆盖并创建自己的。
推荐阅读
- python - 我无法在 iplot 中的 python 中使用交互
- sql - 分组中的部分总和?
- apache-kafka - 使用kafka-python消费kafka,seek()重置的本地偏移量会提交给kafka吗?
- python - 为什么随着训练的进行保存 state_dict 会变慢?
- regex - 批处理脚本中的正则表达式
- angular - 为什么 npm-ci 修复了我们的 TypeErrors、Assertion Error 等?
- python - 基于特定未经身份验证用户的 ip 地址的 django 油门速率限制
- rust - 如何为 gtk 调用创建“if-let”块?
- android - 应用程序关闭时显示灰色圆圈作为通知图标
- discord - 使用 Discord Bot 显示 Youtube 视频