如何更改对应于@NotNull注释返回的响应JSON

我有一个简单的代码,当requestBody中没有customerId时返回错误json。

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 ) {}

目前,当requestBody中没有customerId时,返回的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"}

如何将@Notnull返回的上述Json结构更改为如下所示的JSON结构:

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

编辑 - 我已经知道我们可以抛出自定义异常并在ControllerAdvice中处理它,但考虑验证所需的字段数是否为20,检查null和throw异常所需的代码量也会扩大,使代码看起来很难看。这就是我发布这个Qn的原因。


慕哥6287543
浏览 2261回答 2
2回答

有只小跳蛙

将以下方法添加到控制器建议带注释的异常处理程序:&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;ResponseEntity<Object>&nbsp;handleMethodArgumentNotValid( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodArgumentNotValidException&nbsp;ex,&nbsp;HttpHeaders&nbsp;headers,&nbsp;HttpStatus&nbsp;status, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebRequest&nbsp;request)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;your&nbsp;custom&nbsp;error&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//you&nbsp;can&nbsp;access&nbsp;to&nbsp;field&nbsp;errors&nbsp;using &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//ex.getBindingResult().getFieldErrors() &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@ExceptionHandler(value&nbsp;=&nbsp;{&nbsp;javax.validation.ConstraintViolationException.class&nbsp;}) &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;ResponseEntity<Object>&nbsp;handleConstraintViolation( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javax.validation.ConstraintViolationException&nbsp;ex)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;your&nbsp;custom&nbsp;error&nbsp;message &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@ExceptionHandler(value&nbsp;=&nbsp;{&nbsp;org.hibernate.exception.ConstraintViolationException.class&nbsp;}) &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;ResponseEntity<Object>&nbsp;handleHibernateConstraintViolation( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.exception.ConstraintViolationException&nbsp;ex)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;your&nbsp;custom&nbsp;error&nbsp;message &nbsp;&nbsp;&nbsp;&nbsp;}

千万里不及你

我想我们也可以像这样编写Controller建议,而不需要扩展ResponseEntityExceptionHandler并覆盖它的任何方法@RestControllerAdvicepublic&nbsp;class&nbsp;GlobalExceptionHandler&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@ExceptionHandler(value&nbsp;=&nbsp;{&nbsp;MethodArgumentNotValidException.class&nbsp;}) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;ResponseEntity<Object>&nbsp;handleMethodArgumentNotValid(MethodArgumentNotValidException&nbsp;ex){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomException&nbsp;cex&nbsp;=&nbsp;new&nbsp;CustomException(ex.getBindingResult().getFieldError().getDefaultMessage()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;ResponseEntity<>(cex,&nbsp;new&nbsp;HttpHeaders(),&nbsp;HttpStatus.INTERNAL_SERVER_ERROR);}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java