在MethodArgumentNotValidException之后获取无效字段的值

时间:2016-03-30 06:33:02

标签: spring hibernate spring-mvc spring-boot spring-data

我的实体类使用@NotNull hibernate注释其中一个字段。我正在@ExceptionHelper中捕获异常。我的问题是我想访问无效字段的值,以便我可以将它添加到记录器中。

以下是ExceptionHandler

@ExceptionHandler({ MethodArgumentNotValidException .class })
@ResponseBody
public ResponseEntity<?> handleInvalidMethodArgException(MethodArgumentNotValidException  de) {
    List<FieldError> bindingResult = de.getBindingResult().getFieldErrors();
    LOGGER.debug(String.format("Start : %s : handleDataexception()", this
                .getClass().getSimpleName()));

    for(FieldError fieldError: bindingResult){
        LOGGER.debug("Invalid {} value submitted for {}", 
                            fieldError.getRejectedValue(), fieldError.getField());
    }

    ErrorMsg = new ErrorMsg(errorCode, errorMessage);
    return new ResponseEntity<>(errMsg, HttpStatus.NOT_FOUND);
}

我在控制器中添加了@Validated @RequestBody

2 个答案:

答案 0 :(得分:7)

MethodArgumentNotValidExceptiongetBindingResult方法,如果失败与验证相关,则返回BindingResult,如果没有则返回null。因此,您可以调用getFieldErrors方法,该方法返回FieldErrorList。每个FieldError都有一个getRejectedValue,它会为您提供相应字段的无效值:

ex.getBindingResult().getFieldErrors().forEach(fieldError -> {
            LOGGER.debug("Invalid {} value submitted for {}", 
                    fieldError.getRejectedValue(), fieldError.getField());
});

exMethodArgumentNotValidException的实例。

答案 1 :(得分:1)

您的实体不会存储不正确的值此外,在前面使用实体对象是不好的做法。您应该创建一个DTO对象,而不是将其发送到您的应用程序。检查它(这里你可以向记录器添加不正确的人员),然后将其处理到你的实体对象并尝试保存或你想做什么。 enter image description here