【问题标题】:java.lang.NoSuchMethodError: org.springframework.http.MediaType.getCharset()Ljava/nio/charset/Charsetjava.lang.NoSuchMethodError: org.springframework.http.MediaType.getCharset()Ljava/nio/charset/Charset
【发布时间】:2022-04-22 18:43:08
【问题描述】:

当我尝试通过ant 运行我的TestNG 测试时,我得到java.lang.NoSuchMethodError: org.springframework.http.MediaType.getCharset()Ljava/nio/charset/Charset(请参阅下文了解完整的例外情况)

我在编译或运行我的 Web 应用程序时没有问题,但无法通过 ant 运行测试。我相当确定这是一个类加载问题,但不确定在运行时应该按什么顺序加载类。我正在使用 Spring 4.3.1 和 Spring Security 4.1.1。

是否有特定的顺序来加载我的 jar,以便使用“正确”版本的 org.springframework.http.MediaType

[testng] org.testng.TestNGException: 
   [testng] An error occurred while instantiating class com.avada.rest.api.GroupsIntTest: org.springframework.http.MediaType.getCharset()Ljava/nio/charset/Charset;
   [testng]     at org.testng.internal.ClassHelper.createInstance1(ClassHelper.java:388)
   [testng]     at org.testng.internal.ClassHelper.createInstance(ClassHelper.java:290)
   [testng]     at org.testng.internal.ClassImpl.getDefaultInstance(ClassImpl.java:125)
   [testng]     at org.testng.internal.ClassImpl.getInstances(ClassImpl.java:191)
   [testng]     at org.testng.TestClass.getInstances(TestClass.java:104)
   [testng]     at org.testng.TestClass.initTestClassesAndInstances(TestClass.java:90)
   [testng]     at org.testng.TestClass.init(TestClass.java:82)
   [testng]     at org.testng.TestClass.<init>(TestClass.java:45)
   [testng]     at org.testng.TestRunner.initMethods(TestRunner.java:409)
   [testng]     at org.testng.TestRunner.init(TestRunner.java:247)
   [testng]     at org.testng.TestRunner.init(TestRunner.java:217)
   [testng]     at org.testng.TestRunner.<init>(TestRunner.java:161)
   [testng]     at org.testng.SuiteRunner$DefaultTestRunnerFactory.newTestRunner(SuiteRunner.java:555)
   [testng]     at org.testng.SuiteRunner.init(SuiteRunner.java:168)
   [testng]     at org.testng.SuiteRunner.<init>(SuiteRunner.java:117)
   [testng]     at org.testng.TestNG.createSuiteRunner(TestNG.java:1359)
   [testng]     at org.testng.TestNG.createSuiteRunners(TestNG.java:1346)
   [testng]     at org.testng.TestNG.runSuitesLocally(TestNG.java:1200)
   [testng]     at org.testng.TestNG.runSuites(TestNG.java:1124)
   [testng]     at org.testng.TestNG.run(TestNG.java:1096)
   [testng]     at org.testng.TestNG.privateMain(TestNG.java:1425)
   [testng]     at org.testng.TestNG.main(TestNG.java:1394)
   [testng] Caused by: java.lang.NoSuchMethodError: org.springframework.http.MediaType.getCharset()Ljava/nio/charset/Charset;
   [testng]     at org.springframework.web.client.RestTemplate$AcceptHeaderRequestCallback.getSupportedMediaTypes(RestTemplate.java:757)
   [testng]     at org.springframework.web.client.RestTemplate$AcceptHeaderRequestCallback.doWithRequest(RestTemplate.java:733)
   [testng]     at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:617)
   [testng]     at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:580)
   [testng]     at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:287)
   [testng]     at com.avada.rest.api.ApiTestClient.getAll(ApiTestClient.java:81)
   [testng]     at com.avada.rest.api.GroupsIntTest.<clinit>(GroupsIntTest.java:17)
   [testng]     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
   [testng]     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
   [testng]     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
   [testng]     at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
   [testng]     at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:29)
   [testng]     at org.testng.internal.ClassHelper.createInstance1(ClassHelper.java:377)
   [testng]     ... 21 more
   [testng] The tests failed.

【问题讨论】:

  • 听起来像是 Java 版本不匹配
  • @paulsm4 - 我的${ant.java.version}${java.version} 显示为1.71.7.0_80。我的 $JAVA_HOME 显示为 /usr/lib/jvm/java-7-oracle - 我还需要在哪些其他地方检查 Java 版本?
  • 您是否尝试过清理和构建您的项目?
  • @NikuHysa - 是的......每次我运行我清理和构建的测试
  • @ZackMacomber 感谢您的回复。 getCharSet() 在 spring-web 5.0.8 中更改为 getCharset()。这就是我收到此错误的原因。

标签: java spring ant nosuchmethoderror


【解决方案1】:

难以置信...再次被类加载问题挫败...一个名为activemq-minimal-5.13.3.jar 的超级jar 引用了导致冲突的spring jar。 activemq-minimal-5.13.3.jar 按字母顺序排在spring 之前,因此activemq jar 中的类正在通过spring jar 加载/使用。更新了我的 ant 构建以首先加载 spring 类,现在一切就绪。

我发现的方法是我将所有 3rd 方库放在一个“测试”项目中并添加/删除 jars(有点倾向问题所在),直到我能够确定类加载的位置问题是。

【讨论】:

  • 感谢您的更新!请“接受”您的解决方案。
  • “难以置信......再次被类加载问题所挫败......” -> 不只是我一次又一次地与 Spring 的类加载问题作斗争,所以它不是那么明显事情;)
  • 我也遇到过这个错误。为了修复我的项目设置,在我的 Maven POM 文件中,我所做的只是将 activemq-all 的 标签移动到所有 Spring 框架(spring-web、spring-core 等)的所有 标签下方我相信这与重新排序依赖关系是一样的,以便在 activemq-all 之前首先加载 Spring 框架 jar。
【解决方案2】:

org.springframework.http.MediaType.getCharset() 是从 4.​​3 开始引入的,如果 java 没有找到它,这意味着你的类路径中有一个低于 4.3.1 的 spring-core 版本,它会被加载和使用。

【讨论】:

  • 它对我有用。我更新了spring core版本> 4.3
  • @Ankita 我正在使用 Spring 5.0.8,并且 getChaset 遇到相同的错误 nosuchmethod。
【解决方案3】:

在春季最新版本中他们已经修改了

org.springframework.http;

MediaType contentType = headers.getContentType();

旧:

      contentType.getCharSet()

新功能:

     contentType.getCharset()

【讨论】:

  • :-O 难以置信!我快疯了,因为我没有注意到案例从 getCharSet()(在 Spring 4.2 中)到 getCharset()(在 Spring 4.3+ 中)!他们甚至删除了旧版本,至少在 Spring 5.2 中!
【解决方案4】:

在我的例子中,罪魁祸首是 spring-web-4.2.2.RELEASE,将它升级到 >4.2 为我修复了它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2020-07-30
    • 2014-04-23
    • 2021-03-17
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    相关资源
    最近更新 更多