json - Grails 3.1.8 : Spring Rest Docs using Rest Assured giving PayloadHandlingException: com. fastxml.jackson.databind.JsonMappingException

标签 json grails rest-assured asciidoc spring-restdocs

我正在尝试使用 Grails Rest-API 的片段来实现 ascii 文档,并使用 JSON 响应的 Rest-assured 来实现:

    {
  "instanceList": [
    {
      "firstName": "Coy",
      "lastName": "T",
      "pictureUrl": null,
      "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="80e2efeff4f3f4f2e1f0c0e3e3aee3efed" rel="noreferrer noopener nofollow">[email protected]</a>",
      "bio": null,
      "skills": [],
      "interestAreas": []
    },
    {
      "firstName": "Jane",
      "lastName": "D",
      "pictureUrl": null,
      "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3c565d52597c5f5f125f5351" rel="noreferrer noopener nofollow">[email protected]</a>",
      "bio": null,
      "skills": [],
      "interestAreas": []
    },
    {
      "firstName": "Cause",
      "lastName": "C",
      "pictureUrl": "https://cc-picture.com",
      "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c1a2a2ecb4b2a4b381a2aea5a4efa2aeac" rel="noreferrer noopener nofollow">[email protected]</a>",
      "bio": "cc beyond infinity",
      "skills": [],
      "interestAreas": []
    },
    {
      "firstName": "sachidanand",
      "lastName": "v",
      "pictureUrl": null,
      "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6102022102024f020e0c" rel="noreferrer noopener nofollow">[email protected]</a>",
      "bio": null,
      "skills": [],
      "interestAreas": []
    }
  ],
  "totalCount": 4
}

以及 UserDocumentationApiSpec 的代码片段(作为 IntegrationTest):

void 'test and document get request for /user'() {
        expect:
        given(documentationSpec)
                .header("AuthToken", "TokenValue")
                .accept(MediaType.APPLICATION_JSON.toString())
                .filter(document('user-list-v1',
                preprocessRequest(modifyUris()
                        .host('127.0.0.1')
                        .removePort()),
                preprocessResponse(prettyPrint()),
                responseFields(
                        fieldWithPath("[].firstName").description("First name of user"),
                        fieldWithPath("[].lastName").description("Last name of user"),
                        fieldWithPath("[].pictureUrl").type(JsonFieldType.STRING).description("Picture Url of user"),
                        fieldWithPath("[].email").description("Email address of user"),
                        fieldWithPath("[].bio").description("Bio data of user"),
                        fieldWithPath("totalCount").description("Count of instanceList field"),
                        fieldWithPath("type").description("Type of result")
                ))).
                when()
                .port(8080)
                .get('/api/v1/user')
                .then()
                .assertThat()
                .statusCode(is(200))
    }

这部分代码给我的错误跟踪为:

org.springframework.restdocs.payload.PayloadHandlingException: com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
 at [Source: [B@2c6adbe3; line: 1, column: 1]
    at org.springframework.restdocs.payload.JsonContentHandler.readContent(JsonContentHandler.java:84)
    at org.springframework.restdocs.payload.JsonContentHandler.findMissingFields(JsonContentHandler.java:50)
    at org.springframework.restdocs.payload.AbstractFieldsSnippet.validateFieldDocumentation(AbstractFieldsSnippet.java:113)
    at org.springframework.restdocs.payload.AbstractFieldsSnippet.createModel(AbstractFieldsSnippet.java:74)
    at org.springframework.restdocs.snippet.TemplatedSnippet.document(TemplatedSnippet.java:64)
    at org.springframework.restdocs.generate.RestDocumentationGenerator.handle(RestDocumentationGenerator.java:192)
    at org.springframework.restdocs.restassured.RestDocumentationFilter.filter(RestDocumentationFilter.java:63)
    at com.jayway.restassured.internal.filter.FilterContextImpl.next(FilterContextImpl.groovy:73)
    at com.jayway.restassured.filter.session.SessionFilter.filter(SessionFilter.java:60)
    at com.jayway.restassured.internal.filter.FilterContextImpl.next(FilterContextImpl.groovy:73)
    at org.springframework.restdocs.restassured.RestAssuredRestDocumentationConfigurer.filter(RestAssuredRestDocumentationConfigurer.java:65)
    at com.jayway.restassured.internal.filter.FilterContextImpl.next(FilterContextImpl.groovy:73)
    at com.jayway.restassured.internal.RequestSpecificationImpl.applyPathParamsAndSendRequest(RequestSpecificationImpl.groovy:1574)
    at com.jayway.restassured.internal.RequestSpecificationImpl.get(RequestSpecificationImpl.groovy:159)
    at com.converge.docs.UserApiDocumentationSpec.$tt__$spock_feature_0_0(UserApiDocumentationSpec.groovy:73)
    at com.converge.docs.UserApiDocumentationSpec.test and document get request for /user_closure2(UserApiDocumentationSpec.groovy)
    at groovy.lang.Closure.call(Closure.java:426)
    at groovy.lang.Closure.call(Closure.java:442)
    at grails.transaction.GrailsTransactionTemplate$1.doInTransaction(GrailsTransactionTemplate.groovy:70)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
    at grails.transaction.GrailsTransactionTemplate.executeAndRollback(GrailsTransactionTemplate.groovy:67)
    at com.converge.docs.UserApiDocumentationSpec.test and document get request for /user(UserApiDocumentationSpec.groovy)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
 at [Source: [B@2c6adbe3; line: 1, column: 1]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
    at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3781)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3721)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2819)
    at org.springframework.restdocs.payload.JsonContentHandler.readContent(JsonContentHandler.java:81)
    ... 21 more

哪里有错误请指正...

最佳答案

我认为此失败的唯一原因是您没有从 /api/v1/user 端点获得预期响应。

请按照以下步骤操作:

  1. 检查数据库中是否存在实例。
  2. 检查您发送的 token 是否正确。
  3. 使用 RestBuilder 编写一个测试用例,看看是否确实得到了预期的响应。

您的代码和 JSON 看起来不错。

此外,请确保遵循此 issue并将空数组字段标记为可选,并显式为其内容提供类型。

我希望这会有所帮助。

关于json - Grails 3.1.8 : Spring Rest Docs using Rest Assured giving PayloadHandlingException: com. fastxml.jackson.databind.JsonMappingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38610041/

相关文章:

javascript - 从 Json 获取键 Javascript 的值

grails - 在hasMany条件中比较属性

java - getString ("K") 是否能够从 json 对象中提取 int 值?

grails - Grails v3.1.4指定用于mongodb连接的加密密码

google-maps - 适用于V3的Google Maps V2的IBM Grails示例

java - RestAssured 调用 https get api 给出错误

java - 放心 : verify creation of entity

java - 验证响应中特定 JSON 对象的 json 模式

jquery - 解析json字符串以获取jQueries getJSON方法提供的同类对象

c# - WCF WebInvoke JSON 反序列化失败 - 400 错误请求