繁体   English   中英

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

[英]Spring Actuator: Error configuring CloudFoundryActuator with multiple custom RestTemplateBuilder beans

我们在 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:创建名为“documentationPluginsBootstrapper”的 bean 时出错 [jar :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: Error create bean with name 'webMvcRequestHandlerProvider' 在 URL [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": false,"loggerFqcn":"org.apache.commons.logging.impl.SLF4JLocationAwareLog","contextMap":{},"threadId":1,"threadPriority":5}

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

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

我不能明确地说,但似乎 Actuator 有一个前提条件,即期望只有一个存在。 是否应该/可以支持多个案例? 也许吧,但目前似乎没有这样做。

如果没有,创建 RestTemplate bean 而不是 RestTemplateBuilders 会起作用吗?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM