Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Bean验证只对Spring中的控制器方法有效?_Java_Spring_Validation_Spring Boot_Javabeans - Fatal编程技术网

Java Bean验证只对Spring中的控制器方法有效?

Java Bean验证只对Spring中的控制器方法有效?,java,spring,validation,spring-boot,javabeans,Java,Spring,Validation,Spring Boot,Javabeans,使用下面的代码进行了尝试,似乎在春季,bean验证只适用于控制器方法(使用@RequestMapping注释的方法),普通方法不会触发bean验证 @RequestMapping(value = "/test-validate", method = RequestMethod.POST) public String test(@Validated Obj obj){ return "validation-works"; } @RequestMapping(value = "/test-

使用下面的代码进行了尝试,似乎在春季,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验证?

答案是:它在当前代码中不起作用,因为在调用
localValidate(obj)
时,您完全跳过了Spring创建的代理,而该代理负责验证部分

选项:

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

  • 问题是@MDeinum在原始问题中添加了一个问题:如何在普通方法中启用bean验证?如果没有使用AspectJ的AOP技巧,您将无法启用它。您可以注册
    MethodValidationPostProcessor
    来启用此功能,但它只适用于外部调用,而不适用于内部调用(由于使用了AOP代理)。