Как изменить ответ, возвращенный JSON в соответствии с аннотацией @NotNull - PullRequest
3 голосов
/ 14 мая 2019

У меня есть простой код, который возвращает ошибку json, когда customerId отсутствует в RequestBody.

VO класс:

public class OrderVO {

    private int orderId;
    @NotNull(message = "CustomerId Cant be null")
    private Long customerId;
}

Метод контроллера:

@RequestMapping(value="/testOrderbyOrderid", method=RequestMethod.GET,produces=MediaType.APPLICATION_JSON_VALUE)
public void testOrderJson (@Valid @RequestBody OrderVO orderVO ) {

}

В настоящее время, когда customerId отсутствует в RequestBody, структура JSON возвращается, как показано ниже:

{
    "timestamp": "2019-05-14T17:08:01.318+0000",
    "status": 400,
    "error": "Bad Request",
    "errors": [
        {
            "codes": [   ],
            "arguments": [     ],
            "defaultMessage": "CustomerId Cant be null",
            "objectName": "orderVO",
            "field": "customerId",
            "rejectedValue": null,
            "bindingFailure": false,
            "code": "NotNull"
        }
    ],
    "message": "Validation failed for object='orderVO'. Error count: 1",
    "path": "/testOrderbyOrderid"
}

как я могу изменить вышеуказанную структуру Json, возвращаемую @Notnull, на структуру JSON, показанную ниже:

{
    "timestamp": "2019-05-14T17:08:01.318+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "CustomerId Cant be null"
}

Редактировать - я уже знаю, что мы можем выбросить пользовательское исключение и обработать его в ControllerAdvice, но примите во внимание, что если количество полей, необходимых для проверки = 20, объем кода, необходимый для проверки исключения null & throw, также увеличится, код выглядит некрасиво. Вот почему я разместил этот Qn.

Ответы [ 2 ]

3 голосов
/ 14 мая 2019

Добавьте методы ниже к вашему контроллеру обработчик аннотированных исключений:

    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(
            MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status,
            WebRequest request) {
        //return your custom error 
        //you can access to field errors using
        //ex.getBindingResult().getFieldErrors()
    }


    @ExceptionHandler(value = { javax.validation.ConstraintViolationException.class })
    protected ResponseEntity<Object> handleConstraintViolation(
            javax.validation.ConstraintViolationException ex) {
        //return your custom error message
    }

    @ExceptionHandler(value = { org.hibernate.exception.ConstraintViolationException.class })
    protected ResponseEntity<Object> handleHibernateConstraintViolation(
            org.hibernate.exception.ConstraintViolationException ex) {
        //return your custom error message
    }

1 голос
/ 14 мая 2019

Полагаю, мы также можем написать совет контроллера таким образом, не расширяя ResponseEntityExceptionHandler и не переопределяя ни один из его методов

@RestControllerAdvice
public class GlobalExceptionHandler {

        @ExceptionHandler(value = { MethodArgumentNotValidException.class })
        protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex){
        CustomException cex = new CustomException(ex.getBindingResult().getFieldError().getDefaultMessage());
        return new ResponseEntity<>(cex, new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...