我使用非常简单的代码返回XML
RestTemplate restTemplate = new RestTemplate();
Source oResponse = restTemplate.postForObject(url, entity, Source.class,
vars);
XPathOperations xpathTemplate = new Jaxp13XPathTemplate();
String address = xpathTemplate.evaluateAsString("//status", oResponse);
但是,我收到以下错误
java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.forName(Ljava/lang/String;)Ljava/lang/Class;
at org.springframework.xml.JaxpVersion.<clinit>(JaxpVersion.java:51)
at org.springframework.xml.transform.TraxUtils.isStaxSource(TraxUtils.java:70)
at org.springframework.xml.xpath.Jaxp13XPathTemplate.evaluate(Jaxp13XPathTemplate.java:131)
at org.springframework.xml.xpath.Jaxp13XPathTemplate.evaluateAsString(Jaxp13XPathTemplate.java:91)
请帮忙。 谢谢, 弗拉基米尔
答案 0 :(得分:16)
运行时的NoSuchMethodError表示您使用的库版本与构建代码的版本不同。
在你的情况下,春天是罪魁祸首。检查运行时类路径上的内容并确保以下内容:
查看http://docs.spring.io/spring/docs/3.2.0.M1/api/org/springframework/util/ClassUtils.html,从Spring 3开始,似乎不推荐使用ClassUtils.forName(String)。我的猜测是你已经针对具有此方法的版本构建了代码但是正在运行它方法已被删除的版本。
ClassUtils类包含在spring-core jar中,因此我确保在编译和运行时都使用相同版本的jar。
答案 1 :(得分:4)
当我们迁移到Spring 4.1.1时,我们遇到了类似的问题
在我们的案例中,我们有一个依赖关系如下
<dependency>
<groupId>org.springframework.javaconfig</groupId>
<artifactId>spring-javaconfig</artifactId>
<version>1.0.0.m3</version>
</dependency>
我们添加了这个依赖项以支持bean的后处理
<bean class="org.springframework.config.java.process.ConfigurationPostProcessor" />
上面的依赖项中有一个类&#34; ProcessUtils.java&#34;,它使用Single参数(String)调用ClassUtils.forName。但是,此方法已被弃用。因此抛出了Exeception。
我从stackoverflow中的另一个post了解到,我们不需要使用Spring 4.1.1的ConfigurationPostProcessor(我不确定启用此支持时的确切版本)
一旦我们从配置(Spring上下文文件)中删除了以下内容,问题就解决了。
答案 2 :(得分:1)
您可能已经想到了这一点但仍然在我的情况下我使用的是spring-orm,其版本与spring-core不同,因此在运行单元测试时会收到类似的错误消息。我从我的经验中了解到,项目中包含的所有spring jar文件应该具有相同的版本以避免不必要的问题。