尝试从json响应中获取节点时出现Java错误

时间:2019-05-03 17:40:50

标签: java json rest-assured

我正在尝试使用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");
}

更新:

enter image description here

3 个答案:

答案 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依赖项。