Наше приложение переносится на Spring boot 3 и Spring 6. Мы видим ошибку: "java.lang.NoSuchMethodError: 'org.springframework.http.HttpStatus org.springframework.http.client.ClientHttpResponse.getStatusCode()"
при тестировании с помощью запроса.
Ошибок компиляции нет, и сборка maven прошла нормально.
Использовал это как ссылку: java.lang.NoSuchMethodError: 'org.springframework.http.HttpStatus org.springframework.http.client.ClientHttpResponse.getStatusCode()'
и проверено, что org.springframework:spring-web:jar:6.1.10 — это используемая версия (из дерева зависимостей).
Только в .factoryPath в eclipse есть ссылка на более старую версию (<factorypathentry kind = "VARJAR" id = "M2_REPO/org/springframework/spring-web/5.3.29/spring-web-5.3.29.jar" enabled = "true" runInBatchMode = "false"/> )
. В дереве зависимостей я не вижу ссылки на более старую Spring-Web.
Есть какие-нибудь указания на ошибку обновления?
Другие использованные банки:
spring-security-oauth2:jar:2.5.1.RELEASE
spring-webmvc:jar:6.1.10
spring-security-core:jar:6.2.5
spring-boot-starter:jar:3.2.7
spring-security-oauth2-client:jar:6.2.5
Код работает как ожидалось
Основная причина этой ошибки заключается в том, что каким-то образом в вашем пути к классу уже скомпилированный двоичный файл пытается вызвать .getStatusCode()
из ClientHttpResponse из Spring Framework 5 . Этот класс был изменен в Spring Framework 6 и Spring Boot 3, так что он возвращает HttpStatusCode
вместо HttpStatus
из предыдущей реализации. Двоичный файл ожидает вызова сигнатуры метода HttpStatus getStatusCode()
, но среда выполнения имеет в пути к классам сигнатуру метода из Spring Framework 6, определенную как HttpStatusCode getStatusCode()
. Следовательно, не возникает исключения такого метода. Вот предыдущий ответ, который поможет вам понять, почему разница в типе возвращаемого значения заставляет среду выполнения выдавать ошибку «нет такого метода».
Найдите точное место, откуда берется трассировка стека, и исследуйте двоичные файлы. Скорее всего, вы обнаружите, что какой-то файл .class не скомпилирован с новой версией Spring-Framework.
Обновлено: По сути, несовместимость, вызывающая вышеизложенное, также может быть определена в вашем вопросе. spring-security-oauth2:jar:2.5.1.RELEASE
не совместим с Spring Framework 6 и Spring Boot 3. Этот jar-файл уже скомпилирован с Spring Framework 5.
Вам следует перенести код и заменить зависимость spring-security-oauth2:jar:2.5.1.RELEASE
, например, на spring-security-oauth2-client:6.3.3
и/или spring-security-oauth2-resource-server:6.3.3
, которые скомпилированы с помощью Spring Framework 6.
Спасибо, Панайотис. Это помогает многое понять. Мы используем OAuth2RestTemplate в нашем приложении. Есть ли у Spring-security-oauth2-client его поддержка?
Что меня пугает, так это тот факт, что вы заявляете об обновлении Spring Boot и обновлении Spring. Такое ощущение, что вы управляете обоими по отдельности, чего делать не следует. Добавьте свой
build.gradle
к вопросу, чтобы узнать, есть ли проблемы с конфликтующими зависимостями.