我不知道 kubernetes 升级是否与该问题有关,但这是我所知道的应用程序按预期工作和开始抛出此异常之间的唯一变化。
我在 Spring Boot 应用程序中有一些代码,将 List 添加到 JSONObject。 该行看起来像这样: jsonObject.put("some_name", someList); 这段代码已经一年没碰过了,但是在 k8s 从 1.21 升级到 1.23 后突然开始抛出这个异常: org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: 'org.json.JSONObject org.json.JSONObject.put(java.lang.String, java.util.Collection)' at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1082) [...] Caused by: java.lang.NoSuchMethodError: 'org.json.JSONObject org.json.JSONObject.put(java.lang.String, java.util.Collection)' at com.example.service.MyClass.convertToJson(MyClass.java:109) k8s 升级还包括从 Java 17.0.5+8 到 Java 17.0.6+10 的更改,但使用这两个 JDK 版本,一切都按预期在本地运行。 我运行了mvn dependency tree -Dverbose,也没有发现任何奇怪的东西。这些是唯一与 json 有关的条目。 org.json:json:jar:20220320 org.springframework.boot:spring-boot-starter-json:jar:2.6.4 我不知道可能导致此问题的原因,因此欢迎提供有关下一步要查看的内容的任何建议。 可能是您的项目中包含的 org.json:json 版本已过期,并且不包含您尝试使用的 put(String, Collection) 方法。尝试将此依赖项更新到更新版本,看看是否可以解决问题。您的项目中也可能存在一些其他依赖项与 org.json:json 冲突或用旧版本覆盖它 - 检查是否有任何类似命名的库(例如,json-simple 而不是 org.json)。您可能还想检查您正在使用的 Spring Boot 版本,因为这可能与您尝试使用的 org.json 库不兼容。 我的 Springboot 项目也遇到了类似的问题, 尽管设置为测试 android-json 的 spring-boot-starter-test 依赖项的范围是在运行时而不是 org.json 中获取的。排除 android-json 对我有用。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>com.vaadin.external.google</groupId> <artifactId>android-json</artifactId> </exclusion> </exclusions> </dependency> 最近,我也遇到了类似的问题。就我而言,是 spring-boot-properties-migrator 导致了问题。当我进行更大的迁移时,该依赖项已包含了相当长一段时间(2021 年 8 月),但后来我忘记删除它。 spring-boot-properties-migrator 包含 android-json 依赖项。 删除 spring-boot-properties-migrator 依赖关系后,问题得到解决。
jsonObject.put("some_name", someList);
这段代码已经一年没碰过了,但是在 k8s 从 1.21 升级到 1.23 后突然开始抛出这个异常:
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: 'org.json.JSONObject org.json.JSONObject.put(java.lang.String, java.util.Collection)' at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1082)
[...]
Caused by: java.lang.NoSuchMethodError: 'org.json.JSONObject org.json.JSONObject.put(java.lang.String, java.util.Collection)' at com.example.service.MyClass.convertToJson(MyClass.java:109)
k8s 升级还包括从 Java 17.0.5+8 到 Java 17.0.6+10 的更改,但使用这两个 JDK 版本,一切都按预期在本地运行。
我运行了
mvn dependency tree -Dverbose
org.json:json:jar:20220320
org.springframework.boot:spring-boot-starter-json:jar:2.6.4
我不知道可能导致此问题的原因,因此欢迎提供有关下一步要查看的内容的任何建议。
可能是您的项目中包含的 org.json:json 版本已过期,并且不包含您尝试使用的 put(String, Collection) 方法。尝试将此依赖项更新到更新版本,看看是否可以解决问题。您的项目中也可能存在一些其他依赖项与 org.json:json 冲突或用旧版本覆盖它 - 检查是否有任何类似命名的库(例如,json-simple 而不是 org.json)。您可能还想检查您正在使用的 Spring Boot 版本,因为这可能与您尝试使用的 org.json 库不兼容。
我的 Springboot 项目也遇到了类似的问题, 尽管设置为测试 android-json 的 spring-boot-starter-test 依赖项的范围是在运行时而不是 org.json 中获取的。排除 android-json 对我有用。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>com.vaadin.external.google</groupId> <artifactId>android-json</artifactId> </exclusion> </exclusions> </dependency>
最近,我也遇到了类似的问题。就我而言,是
spring-boot-properties-migrator
android-json
删除