Spring RestTemplate начинает возвращать 405 METHOD_NOT_ALLOWED после изменения URL во время выполнения - PullRequest
0 голосов
/ 01 апреля 2020

Я столкнулся с интересной проблемой в классе обслуживания в моем приложении 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. Любая помощь / обратная связь приветствуется.

...