Bean验证仅适用于Spring中的控制器方法?

时间:2016-06-15 06:10:37

标签: java spring validation spring-boot javabeans

尝试使用下面的代码,在Spring中,bean验证仅适用于控制器方法(使用@RequestMapping注释的那些),普通方法不会触发bean验证。

@RequestMapping(value = "/test-validate", method = RequestMethod.POST)
public String test(@Validated Obj obj){
    return "validation-works";
}

@RequestMapping(value = "/test-local-method-validate", method = RequestMethod.POST)
public String test2(@Validated Obj obj){
    Obj obj = new Obj();
    localValidate(obj);//won't validate, though content is null
}

void localValidate(@Validated Obj obj){
    log.debug("entered");
}

//Model
public class Obj{
    @NotNull
    public String content = null;
}

如果我们调用第一个方法:/ test-validate,则会触发验证,而对于第二个方法:/ test-local-method-validate,我们使用本地普通方法调用:localValidate,验证不会工作

如果是,如何在普通方法中启用bean验证?

1 个答案:

答案 0 :(得分:1)

答案是:它不适用于您当前的代码,因为在调用localValidate(obj)时,您正在完全跳过Spring创建的代理,并且此代理负责验证部分。

选项:

  1. 您可以将此逻辑提取到另一个包受保护的作用域Spring组件,将其注入控制器并调用它而不是localValidate方法,
  2. org.springframework.validation.Validator注入您的控制器并手动调用