【问题标题】:Bean validation only works for controller methods in Spring?Bean 验证仅适用于 Spring 中的控制器方法?
【发布时间】:2016-06-15 06:10:37
【问题描述】:

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

【问题讨论】:

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

标签: java spring validation spring-boot javabeans


【解决方案1】:

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

选项:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-22
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    相关资源
    最近更新 更多