2016-07-27 4 views
2

Ich versuche ASCII-Dokument mit Snippet für Grails Rest-API mit Ruhe-versichert für JSON-Antwort zu implementieren:Grails 3.1.8: Spring Rest Docs mit Rest Assured geben PayloadHandlingException: com.fasterxml.jackson.databind.JsonMappingException

{ 
    "instanceList": [ 
    { 
     "firstName": "Coy", 
     "lastName": "T", 
     "pictureUrl": null, 
     "email": "[email protected]", 
     "bio": null, 
     "skills": [], 
     "interestAreas": [] 
    }, 
    { 
     "firstName": "Jane", 
     "lastName": "D", 
     "pictureUrl": null, 
     "email": "[email protected]", 
     "bio": null, 
     "skills": [], 
     "interestAreas": [] 
    }, 
    { 
     "firstName": "Cause", 
     "lastName": "C", 
     "pictureUrl": "https://cc-picture.com", 
     "email": "[email protected]", 
     "bio": "cc beyond infinity", 
     "skills": [], 
     "interestAreas": [] 
    }, 
    { 
     "firstName": "sachidanand", 
     "lastName": "v", 
     "pictureUrl": null, 
     "email": "[email protected]", 
     "bio": null, 
     "skills": [], 
     "interestAreas": [] 
    } 
    ], 
    "totalCount": 4 
} 

und der Code-Schnipsel UserDocumentationApiSpec (als 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)) 
    } 

Dieser Teil des Codes mir Fehlertrace geben als:

org.springframework.restdocs.payload.PayloadHandlingException: com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input 
at [Source: [[email protected]; 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: [[email protected]; 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 

Bitte korrigiert mich, wenn ich falsch ...

gehe
+0

Es sieht so aus, als wäre die Antwort von der Get-Anforderung an "http: //127.0.0.1: 8080/api/v1/user" kein gültiger JSON. Wenn Sie es kräuseln, welche Antwort bekommen Sie? –

+0

Hit 'http: //127.0.0.1: 8080/api/v1/Benutzer' von ** Rest Client ** Ich bekomme die richtige ** JSON ** Antwort wie oben, 200 OK Status –

+0

Die Antwort in Ihrer Frage angezeigt ist nicht gültig JSON –

Antwort

1

Der einzige Grund, warum ich für dieses Versagen zu sehen ist, dass Sie die erwartete Antwort von dem /api/v1/user Endpunkt nicht bekommen.

Gehen Sie folgendermaßen vor:

  1. Überprüfen Sie, ob Instanzen dort in der Datenbank vorhanden sind.
  2. Überprüfen Sie, ob Sie das richtige Token senden.
  3. Schreiben Sie einen Testfall mit dem RestBuilder und sehen Sie, ob Sie tatsächlich die erwartete Antwort erhalten.

Ihr Code und JSON sieht gut aus.

Achten Sie außerdem darauf, dass Sie diesem issue folgen, und markieren Sie Ihr leeres Array-Feld als optional und geben Sie explizit einen Typ für seinen Inhalt an.

Ich hoffe, das hilft.

+0

Danke, das hat das Problem gelöst !!, das 'Token', das ich übergeben habe, war falsch und daher war die Antwort nicht da. Auch das Problem, das Sie erwähnten, habe ich gefolgt und den Inhaltstyp zu Arrays hinzugefügt, die leer geantwortet haben. –

1

Ich sehe häufig den Fehler: org.springframework.restdocs.payload.PayloadHandlingException: com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input

Wenn es keine Antwort gibt. Ich sehe das ist eine get Anfrage. Diese Integrationstests funktionieren in Grails etwas anders als RestClient. Haben Sie in diesem Test oder in der bootstrap.Groovy-Datei einen Beispieldatenpunkt eingerichtet? Ich kann den Rest des Codes nicht sehen, wie Sie dies als Integrationstest ausführen. In meinem Beispiel Grails habe ich einige Testdaten in der Datei Bootstrap.groovy eingerichtet.

Bitte lassen Sie mich wissen, wenn ich helfen kann.

+0

Danke. Ja, die Antwort war nicht da. –