Обновление Spring Boot 3 вызывает NoSuchMethodError для ClientHttpResponse.getStatusCode() — как поддержать устаревшие бJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Обновление Spring Boot 3 вызывает NoSuchMethodError для ClientHttpResponse.getStatusCode() — как поддержать устаревшие б

Сообщение Anonymous »

Я обновляю свое основное приложение с Spring Boot 2.x до 3.x.
Обновление в основном успешное, за исключением проблемы совместимости во время выполнения, вызванной сторонними или устаревшими внутренними библиотеками, которые все еще зависят от Spring Boot 2.x и RestTemplate API.

Контекст:
  • Мое основное приложение сейчас использует:

    Spring Boot: 3.x
  • Spring Framework: 6.x
  • JDK: 17
[*]Однако у меня сотни общих SDK/библиотеки (некоторые внутренние, некоторые сторонние), которые:
  • скомпилированы с Spring Boot 2.x
  • используют org.springframework.web.client.RestTemplate
  • Внутренний вызов:

    Код: Выделить всё

    org.springframework.http.client.ClientHttpResponse#getStatusCode()
    
    ожидаю, что он вернет org.springframework.http.HttpStatus.


После обновления во время выполнения я получаю следующую ошибку:

Код: Выделить всё

java.lang.NoSuchMethodError: ‘org.springframework.http.HttpStatus org.springframework.http.client.ClientHttpResponse.getStatusCode()
Это происходит внутри ClientHttpRequestInterceptor в одном из устаревших SDK, который я не могу изменить.
Вот фрагмент трассировки стека:

Код: Выделить всё

Caused by: java.lang.NoSuchMethodError: ‘org.springframework.http.HttpStatus org.springframework.http.client.ClientHttpResponse.getStatusCode()’
at com.legacy.sdk.interceptor.LegacyInterceptor.intercept(LegacyInterceptor.java:46)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:900)
Это имеет смысл, поскольку Spring Framework 6.x изменил сигнатуру метода:
Старый (Spring Boot 2.x / Framework 5.x):
HttpStatus ClientHttpResponse.getStatusCode();
Новый (Spring Boot 3.x / Framework 6.x):
HttpStatusCode ClientHttpResponse.getStatusCode();
Старый метод был удален (не устарел), поэтому библиотеки, ожидающие старую подпись, приведут к сбою.
Дополнительные сведения
  • Я не могу немедленно обновить эти устаревшие библиотеки — некоторые из них являются внешними, некоторые очень глубоко интегрированы.
  • Я уже перенес свой собственный код для использования RestClient вместо RestTemplate.
  • Однако устаревшие зависимости по-прежнему используют RestTemplate, и я не могу их изменить.
Существует ли какая-либо официальная или рекомендованная сообществом стратегия для запуска скомпилированных Spring Boot 2.x SDK (которые основаны на устаревших/удаленных методах, таких как ClientHttpResponse#getStatusCode()) внутри приложения Spring Boot 3?

Подробнее здесь: https://stackoverflow.com/questions/796 ... getstatusc
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»