Я столкнулся с интересной проблемой в классе обслуживания в моем приложении Spring Boot. Мой сервис связывается с внешней системой. Когда я изменяю URL внешнего API во время выполнения через Spring Actuator, RestTemplate
начинает возвращать 405 METHOD_NOT_ALLOWED
код ответа. Подводя итог, вот что я делаю:
- Запустите мое приложение с правильным URL внешнего API (прочитано с
application.properties
) - Позвоните в мою службу через Почтальон: этот вызов успешно, и я получаю правильный ответ от внешней системы
- Позвоните в мою службу пользовательских приводов, чтобы изменить URL внешнего API и сделать ее недействительной
- Звоните в мою службу еще раз: на этот раз я получу
UnknownHostException
, что правильно - Позвоните в службу привода, чтобы изменить URL-адрес на его первоначальное (правильное) значение
- Позвоните в мою службу еще раз: теперь
RestTemplate
начинает возвращать 405 METHOD_NOT_ALLOWED
код ответа, который Я не понимаю.
Я использую RestTemplate
в MyService
следующим образом:
private <T> ResponseEntity<T> send(HttpEntity<?> entity, Class<T> responseClass) {
try {
return restTemplate.exchange(serviceSettings.getUrl(), HttpMethod.POST, entity, responseClass);
} catch (RestClientException e) {
// Handle exception
}
}
, где RestTemplate
создается в конструкторе службы с помощью используя RestTemplateBuilder#build
.
Я включил ведение журнала отладки, чтобы увидеть, что происходит, но это также мало что говорит. Я извлек соответствующую информацию из журналов:
DEBUG org.springframework.web.client.RestTemplate - HTTP POST 'https://correct-external-api-url'
DEBUG org.springframework.web.client.RestTemplate - Accept=[application/json, application/*+json]
DEBUG org.springframework.web.client.RestTemplate - Writing [{data=[PD94bWwg...
DEBUG org.springframework.web.client.RestTemplate - Response 405 METHOD_NOT_ALLOWED
И между этими записями больше ничего нет. SimpleBufferingClientHttpRequest
, кажется, открывает соединение с правильным URL и методом HTTP, но я все равно получаю ответ 405.
Для полноты конечная точка моего пользовательского привода выглядит следующим образом:
@Service
@Endpoint(id="service-settings")
public class SettingsService {
private final ServiceSettings serviceSettings;
public PspSettingsService(ServiceSettings serviceSettings) {
this.serviceSettings = serviceSettings;
}
@WriteOperation
public void changeUrl(String newUrl) {
serviceSettings.setUrl(newUrl);
}
}
Я использую Spring Boot 2.2.4.RELEASE
. Любая помощь / обратная связь приветствуется.