首页 > 解决方案 > 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?

标签: javaspringspring-bootcloud-foundryspring-boot-actuator

解决方案


我的 0.02 美元,但我认为您不应该创建 RestTemplateBuilder 实例。RestTemplateBuilder 的文档说:

在典型的自动配置 Spring Boot 应用程序中,此构建器可作为 bean 使用,并且可以在需要 RestTemplate 时注入。

https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/web/client/RestTemplateBuilder.html

最好你的应用程序可以是“典型的”,除非有充分的理由,否则我不会偏离这一点。所以我认为你想做这样的事情:

// 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 会为您定义一个。虽然,如果您需要,您可以覆盖并创建自己的。


推荐阅读