2017-06-10 213 views
0

我已經在Spring Boot中構建了一個REST服務,它接受JSONPOST編輯到端點。我使用json-schema-validator驗證了JSONPOST版本與JSON架構。出現驗證錯誤時,我會在JSON中收到錯誤消息。我想將錯誤消息發送回JSON中的客戶端。我遇到的問題是,我在自己的JSON對象中收到每條錯誤消息。這不是一個問題,它只有一個錯誤消息,但是如果有多個錯誤,我希望只有一個帶有所有錯誤消息的JSON消息。目前,我在ProcessingReport對象中收到錯誤消息。遍歷ProcessingReport我可以得到每個ProcessingMessage,我可以將其轉換爲JSON創建JSON對象的JSON列表

for(ProcessingMessage message : report) { 
        message.asJson(); 
      } 

每個錯誤消息是這樣的:

{ 
    "level": "error", 
    "schema": { 
     "loadingURI": "#", 
     "pointer": "/properties/parameterDateAdjusted" 
    }, 
    "instance": { 
     "pointer": "/parameterDateAdjusted" 
    }, 
    "domain": "validation", 
    "keyword": "format", 
    "attribute": "date-time", 
    "message": "string \"2017-02-29T23:59:00Z\" is invalid against requested date format(s) [yyyy-MM-dd'T'HH:mm:ssZ, yyyy-MM-dd'T'HH:mm:ss.[0-9]{1,12}Z]", 
    "value": "2017-02-29T23:59:00Z", 
    "expected": [ 
     "yyyy-MM-dd'T'HH:mm:ssZ", 
     "yyyy-MM-dd'T'HH:mm:ss.[0-9]{1,12}Z" 
    ] 
    } 

我想有多個錯誤消息看起來像這樣:

{ 
    "error": 1, 
    "message": { 
    "level": "error", 
    "schema": { 
     "loadingURI": "#", 
     "pointer": "/properties/parameterDateAdjusted" 
    }, 
    "instance": { 
     "pointer": "/parameterDateAdjusted" 
    }, 
    "domain": "validation", 
    "keyword": "format", 
    "attribute": "date-time", 
    "message": "string \"2017-02-29T23:59:00Z\" is invalid against requested date format(s) [yyyy-MM-dd'T'HH:mm:ssZ, yyyy-MM-dd'T'HH:mm:ss.[0-9]{1,12}Z]", 
    "value": "2017-02-29T23:59:00Z", 
    "expected": [ 
     "yyyy-MM-dd'T'HH:mm:ssZ", 
     "yyyy-MM-dd'T'HH:mm:ss.[0-9]{1,12}Z" 
    ] 
    }, 
    "error": 2, 
    "message": { 
    "level": "error", 
    "schema": { 
     "loadingURI": "#", 
     "pointer": "/properties/parameterDateUnadjusted" 
    }, 
    "instance": { 
     "pointer": "/parameterDateUnadjusted" 
    }, 
    "domain": "validation", 
    "keyword": "format", 
    "attribute": "date-time", 
    "message": "string \"2010-11-31T00:00:00Z\" is invalid against requested date format(s) [yyyy-MM-dd'T'HH:mm:ssZ, yyyy-MM-dd'T'HH:mm:ss.[0-9]{1,12}Z]", 
    "value": "2010-11-31T00:00:00Z", 
    "expected": [ 
     "yyyy-MM-dd'T'HH:mm:ssZ", 
     "yyyy-MM-dd'T'HH:mm:ss.[0-9]{1,12}Z" 
    ] 
    } 
} 

什麼是這樣做的最佳途徑?我可以創建一個ListJSON對象,如List<Jsonnode>,並將其轉換爲一個Jsonnode?或者是我可以連接JSON錯誤消息的方式?

+0

您是否已經嘗試在您的方法中返回'List '並查看會發生什麼? –

回答

0

你可以返回一個對象列表,Spring將它映射到一個JSON數組。

@RequestMapping(method = RequestMethod.GET) 
public @ResponseBody 
List<ErrorWrapper> getSomething() throws IOException { 
    List<JsonNode> errorNodes = new ArrayList<>(); 
    errorNodes.add(new ObjectMapper().createObjectNode()); 
    errorNodes.add(new ObjectMapper().createObjectNode()); 

    return IntStream.range(0, errorNodes.size()) 
      .mapToObj(i -> new ErrorWrapper(i + 1, errorNodes.get(i))) 
      .collect(Collectors.toList()); 
} 

而且

public class ErrorWrapper { 
    private int error; 
    private JsonNode message; 

    public ErrorWrapper(int error, JsonNode message) { 
     this.error = error; 
     this.message = message; 
    } 

    public int getError() { 
     return error; 
    } 

    public JsonNode getMessage() { 
     return message; 
    } 
} 

返回

[ 
    { 
     "error": 1, 
     "message": { } 
    }, 
    { 
     "error": 2, 
     "message": { } 
    } 
] 
+0

我希望得到'{「error」:1,「message」:{JSON_FROM_VALIDATION},「error」:2,「message」:{JSON_FROM_VALIDATION}}'。我想我需要爲錯誤1和錯誤2創建節點,然後添加驗證消息。 – g3blv

+0

@ g3blv是的,如果這是你的目標,我會在每個錯誤節點周圍創建一個POJO包裝,或者在節點上循環並自己豐富它們。 –

+0

@ g3blv查看最新的答案 –

0

我把盧西亞諾答案的部分,並用此想出了:

List<JsonErrorMessage> jsonErrorMessages = new ArrayList<>(); 
      int i = 0; 
      for (ProcessingMessage message : report) { 
       i++; 
       jsonErrorMessage.setErrorNumber(i); 
       jsonErrorMessage.setMessage(message.asJson()); 
       jsonErrorMessages.add(jsonErrorMessage); 
      } 

      return (new ResponseEntity(jsonErrorMessages, headers, HttpStatus.BAD_REQUEST)); 

它創造我想要的響應。不知道是否有任何我不知道的問題。