Spring Actuator:使用多个自定义RestTemplateBuilder bean配置CloudFoundryActuator时出错

问题描述 投票:2回答:1

我们在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。

2018-08-28T11:59:17.67-0400 [APP / PROC / WEB / 0] OUT {“timeMillis”:1535471957677,“thread”:“main”,“level”:“WARN”,“loggerName”:“org .springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext“,”message“:”在上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException:在URL [jar]中定义名称为'documentationPluginsBootstrapper'的bean创建错误:file:/home/vcap/app/BOOT-INF/lib/springfox-spring-web-2.7.0.jar!/springfox/documentation/spring/web/plugins/DocumentationPluginsBootstrapper.class]:通过构造函数参数表示的不满意依赖项1;嵌套异常是org.springframework.beans.factory.UnsatisfiedDependencyException:在URL中定义名称为'webMvcRequestHandlerProvider'的bean时出错[jar:file:/ home / vcap / app / BOOT-INF / lib / springfox-spring-web- 2.7.0.jar!/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProvider.class]:不满意依赖ency通过构造函数参数0表示;嵌套异常是org.springframework.beans.factory.UnsatisfiedDependencyException:在类路径资源[org / springframework / boot / actuate / cloudfoundry / CloudFoundryActuatorAutoConfiguration.class]中定义名称为'cloudFoundryEndpointHandlerMapping'的bean创建错误:通过方法'cloudFoundryEndpointHandlerMapping'表示不满意的依赖关系参数1;嵌套异常是org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有类型'org.springframework.boot.web.client.RestTemplateBuilder'的限定bean可用:期望的单个匹配bean但找到2:internal_api,external_api“,”endOfBatch“:假, “loggerFqcn”: “org.apache.commons.logging.impl.SLF4JLocationAwareLog”, “contextMap”:{} “的threadId”:1, “threadPriority”:5}

这是一个错误吗?在Cloud Foundry上使用弹簧执行器时,您是否都不允许配置多个RestTemplateBuilder bean?有没有办法解决这个错误?如果没有,是否会创建RestTemplate bean而不是RestTemplateBuilders?如果是这种情况,那么CloudFoundryActuatorAutoConfiguration类在Cloud Foundry上部署时是否需要至少定义一个RestTemplateBuilder bean?

java spring spring-boot pivotal-cloud-foundry spring-boot-actuator
1个回答
2
投票

我的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上使用弹簧执行器时,您是否都不允许配置多个RestTemplateBuilder bean?有没有办法解决这个错误?

我不能毫不含糊地说,但似乎Actuator有一个前提条件,只有一个存在。应该/可以支持多个案例吗?也许,但目前似乎并没有这样做。

如果没有,是否会创建RestTemplate bean而不是RestTemplateBuilders?

我相信这是要走的路,见上文。

如果是这种情况,那么CloudFoundryActuatorAutoConfiguration类在Cloud Foundry上部署时是否需要至少定义一个RestTemplateBuilder bean?

不,看起来Spring Boot会为你定义一个。虽然,如果您需要,您可以覆盖并创建自己的。

© www.soinside.com 2019 - 2024. All rights reserved.