我们在带有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”,“消息”:“上下文初始化期间遇到异常-取消刷新尝试: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:在URL [jar:file:/ home / vcap / app / BOOT-INF / lib / springfox-spring中创建名称为'webMvcRequestHandlerProvider'的bean时出错-web-2.7.0.jar!/springfox/documentation/spring/web/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:没有类型为'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上使用弹簧执行器时,是否所有人都不能配置多个RestTemplateBuilder bean?有没有解决此错误的方法?如果不是,创建RestTemplate bean而不是RestTemplateBuilders可以吗?如果是这种情况,那么在Cloud Foundry上部署CloudFoundryActuatorAutoConfiguration类时是否至少需要定义一个RestTemplateBuilder bean?
答案 0 :(得分:2)
我的$ 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上使用弹簧执行器时,是否所有人都不能配置多个RestTemplateBuilder bean?有没有办法解决这个错误?
我不能明确地说,但似乎执行器有一个前提条件,要求只有一个条件存在。是否应该/可以支持不止一个案件?也许可以,但是目前看来还没有。
如果没有,那么创建RestTemplate bean而不是RestTemplateBuilders可以吗?
我相信这是要走的路,见上文。
如果是这种情况,那么在Cloud Foundry上部署CloudFoundryActuatorAutoConfiguration类时是否至少需要定义一个RestTemplateBuilder bean?
不,看来Spring Boot将为您定义一个。不过,如果需要,您可以覆盖并创建自己的。