我正在尝试使用Restsure和Java从json路径中的节点检索详细信息。但是我一直收到以下错误:
java.lang.NoClassDefFoundError: org/apache/groovy/io/StringBuilderWriter
at io.restassured.internal.path.json.ConfigurableJsonSlurper.parseObject(ConfigurableJsonSlurper.groovy:202)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
at io.restassured.internal.path.json.ConfigurableJsonSlurper.parse(ConfigurableJsonSlurper.groovy:105)
at io.restassured.internal.path.json.ConfigurableJsonSlurper$parse.callCurrent(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
at io.restassured.internal.path.json.ConfigurableJsonSlurper.parseText(ConfigurableJsonSlurper.groovy:83)
at io.restassured.path.json.JsonPath$4$1.method(JsonPath.java:949)
at io.restassured.path.json.JsonPath$ExceptionCatcher.invoke(JsonPath.java:984)
at io.restassured.path.json.JsonPath$4.doParseWith(JsonPath.java:951)
at io.restassured.path.json.JsonPath$JsonParser.parseWith(JsonPath.java:1031)
at io.restassured.path.json.JsonPath.get(JsonPath.java:202)
at uk.co.hermes.cucumber.utils.xxx.postAccessToken(xxx.java:86)
at uk.co.hermes.cucumber.utils.xxx.unblockUser(xxx.java:27)
我知道问题出在代码中的这一行:
String token = jsonPathEvaluator.get("token");
如何解决?
public void postAccessToken(){
RestAssured.baseURI = "https://xxx";
JSONObject requestJsonBodyParams = new JSONObject();
requestJsonBodyParams.put("test", "xxx");
Response response = RestAssured.given()
.contentType(jsonContentType).
body(requestJsonBodyParams.toString()).
when().
post("/");
Assert.assertEquals(response.statusCode(), 200);
JsonPath jsonPathEvaluator = response.jsonPath();
String token = jsonPathEvaluator.get("token");
}
更新:
答案 0 :(得分:3)
我的答案假设您正在使用Maven / Gradle。如果不是这种情况,请告诉我们。
此错误表明缺少对类路径的依赖,或者版本崩溃。通常,这不会发生,因为您使用的依赖项应包括传递性依赖项对其自身的依赖项。至于放心,它包含对groovy的依赖:
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
</dependency>
然后,这种情况可能有几种潜在原因:
或者您已经从可放心的依赖中排除了对groovy的可传递依赖,或者您对groovy的依赖与版本不同于可放心的期望(该类不可用)。第三种选择是,您有多种依赖于Groovy的依赖关系,并且具有不同的版本。
如果您使用的是maven,则可以通过以下命令进行快速检查:
mvn dependency:tree -Dincludes=org.codehaus.groovy
如果可以尝试,请发布结果。
另外,让我们知道您正在使用哪个版本的RestAssured。
更新:
从您的dependency:tree输出中,您可以看到这里有多个常规版本。我想添加了2.5.6作为修复此问题的方法,您可以删除它,因为它只会给您带来版本崩溃。
但是,好的部分:
您有两个依赖项:
net.serenity-bdd:serenity-core:1.5.2
net.serenity-bdd:serenity-rest-assured:2.0.48
它们每个都具有常规的依赖关系,但分别适用于截然不同的版本2.4.11和2.5.5。这会导致版本崩溃,因为期望2.5.5的代码突然必须与2.4.11一起工作。
缺少的类已在版本2.4.11之后添加到代码库中,因此您有希望该类存在的代码,但实际上不是。
有两种解决方法:
向groovy添加显式依赖,因为这将覆盖任何传递依赖的版本:
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.5.5</version>
</dependency>
尽管这不是修复它的最佳方法,因为您仍然会假设您正在使用2.4.11版本。
解决此问题的正确方法是对齐两个提到的依赖项的版本:
net.serenity-bdd:serenity-core:1.5.2
net.serenity-bdd:serenity-rest-assured:2.0.48
在不了解有关此框架的任何细节的情况下,我假设您应该对这两个依赖项使用相同的版本。
更新#2:
谷歌快速搜索显示这两个依赖项似乎遵循相同的版本控制方案。总结起来,要么将serentiy-core升级到2.0.48,要么将保证平静的级别降级到1.5.2。另外,删除对groovy-all的依赖。
答案 1 :(得分:1)
尝试将groovy-all.jar
添加到您的类路径中。如果您使用的是maven,请添加:
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.5.6</version>
<type>pom</type>
</dependency>
对于gradle:
compile group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.5.6', ext: 'pom'
答案 2 :(得分:0)
我遇到了同样的错误,在POM.xml中深入研究之后,我发现存在多个常规依赖项,但是删除了这个问题:
就像魅力一样运作。我不确定这是否有帮助,但是可以,请尝试删除多个groovy依赖项。