Spring Actuator: Ошибка настройки CloudFoundryActuator с несколькими пользовательскими компонентами RestTemplateBuilder - PullRequest
0 голосов
/ 29 августа 2018

Мы настраиваем два отдельных bean-компонента RestTemplateBuilder в аннотированном классе java @Configuration следующим образом:

@Bean("internal_api")
public RestTemplateBuilder internalRestTemplateBuilder(@Autowired 
OAuthConsumerOperations oAuthConsumerOperations) {
...    
}

@Bean("external_api")
public RestTemplateBuilder externalRestTemplateBuilder(){
...
}

Когда мы разворачиваем приложение в Pivotal Cloud Foundry Apps Manager, мы получаем ошибку ниже. Жалуется, что было обнаружено более одного компонента RestTemplateBuilder, когда он ожидает только один.

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: ошибка при создании bean-компонента с определенным тегом в документации по имени". URL [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: ошибка при создании bean-компонента с именем 'webMvcRequestHandlerProvider', определенным в URL [jar: file: / home / vcap / app / BOOT-INF / lib / springfox-spring -web-2.7.0.jar! /springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProvider.class]: неудовлетворен зависимость выражается через параметр конструктора 0; вложенным исключением является org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка создания бина с именем «cloudFoundryEndpointHandlerMapping», определенного в ресурсе пути к классу [org / springframework / boot / activate / cloudfoundry / CloudFoundryActuoundAutoConfusionsDefindFirectory_Exchange.Exchange.class) параметр 1; вложенное исключение: org.springframework.beans.factory.NoUniqueBeanDefinitionException: нет квалифицированного компонента типа 'org.springframework.boot.web.client.RestTemplateBuilder' доступно: ожидается один соответствующий компонент, но найдено 2: internal_api, external_apf ", ложным, "loggerFqcn": "org.apache.commons.logging.impl.SLF4JLocationAwareLog", "contextMap": {}, "ThreadId": 1, "threadPriority": 5}

Это ошибка? Разрешено ли вам всем настраивать несколько компонентов RestTemplateBuilder при использовании пружинного привода в Cloud Foundry? Есть ли способ обойти эту ошибку? Если нет, будет ли работать создание бинов RestTemplate вместо RestTemplateBuilders? Если это так, то требует ли класс CloudFoundryActuatorAutoConfiguration хотя бы один компонент RestTemplateBuilder для определения при развертывании в Cloud Foundry?

1 Ответ

0 голосов
/ 31 августа 2018

Мои $ 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
}

Чтобы ответить на ваши вопросы конкретно:

Это ошибка? Разрешено ли вам всем настраивать несколько компонентов RestTemplateBuilder при использовании пружинного привода в Cloud Foundry? Есть ли способ обойти эту ошибку?

Я не могу сказать однозначно, но, похоже, у Привода есть предварительное условие, которое предполагает существование только одного. Должен ли он / может поддерживать случаи с более чем одним? Возможно, но в данный момент этого не происходит.

Если нет, будет ли работать создание бинов RestTemplate вместо RestTemplateBuilders?

Я считаю, что это путь, см. Выше.

Если это так, то требует ли класс CloudFoundryActuatorAutoConfiguration хотя бы один компонент RestTemplateBuilder для определения при развертывании в Cloud Foundry?

Нет, похоже, Spring Boot определит для вас. Хотя, если вам нужно, вы можете переопределить и создать свой собственный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...