【问题标题】:@ExceptionHandler method doesn't work when BindingResult parameter present in handler method当处理程序方法中存在 BindingResult 参数时,@ExceptionHandler 方法不起作用
【发布时间】:2021-11-12 20:44:03
【问题描述】:

我正在使用 javax 验证 api 验证字段(用户)。

用户:

@Data
public class User {

    public String name;
    @Min(18)
    public int age;

    public User(String nameString, int age) {
        super();
        this.nameString = nameString;
        this.age = age;
    }
    

Controller类中的Handler方法:

@RestController
public class ControllerMain {

    @PostMapping("userdata")
    //Here is BindingResult !!
    public void validdata(@Valid @RequestBody User user,BindingResult bindingResult) {
        
    }
        
}

用于异常处理的ControllerAdvice 类

@ControllerAdvice
public class ExceptionHandlingController {

    @ExceptionHandler({MethodArgumentNotValidException.class, HttpMessageNotReadableException.class})
    public void invalidinput() {
        
        //This should be printed on console but its not.Kindly help!
        System.out.println("Invalid Input!");
    }

}

如果我从控制器类中的处理程序方法中删除 BindingResult 参数,则控制台上会打印“无效输入”。为什么会这样?

【问题讨论】:

    标签: spring spring-boot spring-mvc


    【解决方案1】:

    它是 Spring MVC 规范。

    1.3.3. Handler Methods > @RequestBody:

    您可以将 @RequestBodyjavax.validation.Valid 或 Spring 的 @Validated 注释结合使用,这两者都会导致应用标准 Bean 验证。默认情况下,验证错误会导致 MethodArgumentNotValidException,它会变成 400 (BAD_REQUEST) 响应。或者,您可以通过 ErrorsBindingResult 参数在控制器本地处理验证错误,如下例所示:

    @PostMapping("/accounts")
    public void handle(@Valid @RequestBody Account account, BindingResult result) {
        // ...
    }
    

    【讨论】:

    • 您好,请详细说明,我这里没有使用模型属性注解。
    • 更新了它的引用部分。
    • "或者,您可以通过 Errors 或 BindingResult 参数在控制器内本地处理验证错误" 看起来您可以使用 BindingResult“自己处理”,或者让 Spring 抛出异常,然后你可以捕获它。
    猜你喜欢
    • 2017-12-28
    • 1970-01-01
    • 2019-01-28
    • 2020-12-29
    • 2018-04-28
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    相关资源
    最近更新 更多