【问题标题】:JSR 303 set custom validator for cascade @validJSR 303 为级联 @valid 设置自定义验证器
【发布时间】:2012-07-10 15:34:54
【问题描述】:

我想验证另一个表单对象中包含的表单对象。我有这样的事情:

@Controller
public class FormController {
    @RequestMapping(method = RequestMethod.POST)
    public void process(@ModelAttribute("form") @Valid FormObject formObject, 
                              BindingResult result) {
            ...
        @InitBinder("form")
        protected void initBinder(WebDataBinder binder) {
             binder.setValidator(customFormValidator);
        }
    }

public class FormObject {
    @Valid
    private FormObject2 formObject2;
}

// This is the class that needs to be validated.
public class FormObject2 {
    @NotEmpty
    private String name;
}
}

我遇到的问题是我希望对象 formObject2 由另一个自定义验证器(例如“customFormValidator2”)验证,但我找不到如何注册它。如果我让它这样,spring 验证器将验证第二种形式。

我已经尝试在 customFormValidator 中验证第二个表单,但是第二个表单中的错误路径与第一个表单无关,我无法在 jsp 页面中显示错误。

我已经像这样构造了我的表单对象,因为我可能需要在其他表单中使用第二个表单,并且通过这样做我使它更加模块化。

这可能是我想要做的吗?你有更好的建议吗?

【问题讨论】:

    标签: spring hibernate bean-validation customvalidator


    【解决方案1】:

    您可以使用自定义验证器来验证form Object2 之类的

     public void process(@ModelAttribute("form") @Valid FormObject formObject, 
                                  BindingResult result) {
    customFormValidator2.validate(formObject.getFormObject2(), result);  
    }  
    

    并移除 @Valid 以移除 JSR 验证

    public class FormObject {
     //   @Valid REMOVE THIS
         private FormObject2 formObject2;
    }
    

    您也可以为嵌套类使用路径属性,例如

    <form:input path="formObject2.any_property_name">  
    

    您也可以毫无问题地使用相同的错误路径。
    查看此link 了解更多详情。

    【讨论】:

    • 问题是我使用这个路径
    • 如果我对 FormObject2 使用@valid,spring 验证器知道上下文是针对 formObject2。
    • 我想与@valid 一起使用我的自定义验证器,它在其实现中使用了spring 验证器,也许我可以为错误找到正确的路径。我不确定它是否有意义我想说什么
    • @Marius:我现在有点困惑。如果您想显示某些输入的验证错误,则 &lt;form:error&gt; 路径属性应该与输入相同。为什么你保持那么不同?正如您所提到的,您已经为FormObject2 编写了spring 验证器,那么为什么要使用@Valid 即JSR 验证?而不是你应该使用.validate() 方法,在这里你混合了spring和JSR验证。
    猜你喜欢
    • 2018-10-02
    • 2015-07-31
    • 2011-09-29
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2019-02-03
    • 2015-01-10
    相关资源
    最近更新 更多