【问题标题】:Spring MVC Bean ValidationSpring MVC Bean 验证
【发布时间】:2012-04-23 21:38:10
【问题描述】:

我必须为使用 Spring MVC 3 的 Web 应用程序实现验证。问题是 bean 类具有 getProperty("name") 和 setProperty("name",valueObj) 等方法。必须对通过将不同值传递给 getProperty("name") 返回的数据进行验证,例如: getProperty("age") 应该大于 16 并且 getProperty("state") 应该是必需的。

我想知道是否支持验证这种 Bean,如果没有,可以解决什么问题。

谢谢, 阿提夫

【问题讨论】:

  • 恕我直言,该类不是 bean。

标签: java validation spring-mvc bean-validation


【解决方案1】:

我不这么认为。 Bean 验证在 ja​​vabean 上执行,即具有 getter 和 setter 的类字段。即使您可以注册自定义验证器并进行验证,绑定也不起作用。您还需要注册一个填充您的对象的自定义活页夹。它变得相当复杂。所以坚持 javabeans 约定。

【讨论】:

    【解决方案2】:

    听起来您想要一个实现org.springframework.validation.Validator 的自定义验证类。

    @Component
    public class MyValidator implements Validator {
    
        @Override
        public boolean supports(Class<?> clazz) {
            return MyBean.class.isAssignableFrom(clazz);
        }
    
        @Override
        public void validate(Object target, Errors errors) {
            MyBean myBean = (MyBean) target;
    
            if (StringUtils.isBlank(myBean.getProperty("state"))) {
                errors.rejectValue("state", "blank");
            }
        }
    
    }
    

    在您的控制器中,您可以进行如下手动验证:

    @Autowired
    private MyValidator myValidator;
    
    @RequestMapping(value = "save", method = RequestMethod.POST)
    public String save(@ModelAttribute("myBean") MyBean myBean, BindingResult result) {
    
        myValidator.validate(myBean, result);
        if (result.hasErrors()) {
            ...
        }
    
        ...
    
    }
    

    【讨论】:

    • +1,这将起作用。但是他的bean不会被正确绑定,这是在验证之前。因此,还需要自定义绑定。 ;)
    • @Bozho 很好的观点,真正的 JavaBeans 的另一个论点 :)
    • 在 Struts 1.x 中被称为 DynaBean,只需在 xml 中定义 bean 属性,而无需创建每个类的开销。 Spring 是否提供了动态或通过配置创建 Bean 类的任何此类方法?就像我们可以在 XML 中定义 bean 和验证一样吗?
    猜你喜欢
    • 2015-01-06
    • 1970-01-01
    • 2013-04-14
    • 2013-09-10
    • 1970-01-01
    • 2016-03-02
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多