#spring #spring-boot
#spring #spring-boot
Вопрос:
У меня есть модуль rest client maven, который отвечает за получение токена, а затем за создание запросов с использованием этого токена.
Вот метод «login ()» :
private static final String ROOT_URL = "https://my-url";
private static final String LOGIN_API = "/LogIn";
@Autowired
@Qualifier("myRestTemplate")
RestTemplate restTemplate;
public String login() {
LoginRequest loginRequest = new LoginRequest();
loginRequest.setAccountName("USER");
loginRequest.setPassword("P@ssw0rd");
loginRequest.setTimeout(120);
LoginResponse loginResponse = restTemplate.postForObject(ROOT_URL LOGIN_API, loginRequest, LoginResponse.class);
String token = loginResponse.getLogInResult().getToken();
log.info(loginResponse.toString());
return token;
}
Когда я вызываю этот метод «login ()» из JUnit внутри модуля, он работает.
Также у меня есть различные службы из других модулей, которые зависят от этого клиентского модуля rest, и они могут вызывать его без ошибок.
Теперь я только что создал новый модуль, которому необходимо использовать эту клиентскую службу rest. Когда я вызываю службу «login ()» из этого нового модуля, она заканчивается :
ResourceAccessException: I/O error on POST request for "https://my-url/LogIn":
unable to find valid certification path to requested target
Что может вызвать эту ошибку в одном случае, а не в другом, когда вызываемый URL-адрес является константой?
Я попытался проверить, что объект «RestTemplate» одинаков в обоих случаях, и я думаю, что это так, но даже если бы это было не так, как это могло произойти? с помощью какого механизма?
ОБНОВЛЕНИЕ: Я попытался активировать spring debug в org.springframework.beans, чтобы проверить, может ли неправильное внедрение RestTemplate быть причиной этой проблемы, но когда я делаю это из моего родительского модуля, я даже не вижу внедрения какого-либо RestTemplate.
Похоже, что в разветвленной JVM происходит какой-то процесс, и этот разветвленный процесс не знает о сертификатах (тех, что в $ JAVA_HOME / jre / lib / security / cacerts).
Если я отлажу вызов из дочернего модуля, я увижу, что происходит внедрение RestTemplate.
Комментарии:
1. Я предполагаю, что в вашем модуле у вас нет действительного хранилища доверия, где можно найти действительный корневой центр сертификации. Используете ли вы тот же JDK / JRE, который использовался для модульного теста?
2. Модулю не принадлежит truststore. Та же среда разработки (eclipse), тот же способ запуска JUnit без каких-либо конкретных параметров (создается с помощью Alt shift x, затем t), тот же JDK.