Spring - 将 BindingResult 添加到新创建的模型属性

Posted

技术标签:

【中文标题】Spring - 将 BindingResult 添加到新创建的模型属性【英文标题】:Spring - adding BindingResult to newly created model attribute 【发布时间】:2011-03-04 10:10:43 【问题描述】:

我的任务是 - 通过给定的请求参数创建模型属性,验证它(以相同的方法)并将其完整地提供给视图。

我得到了这个示例代码:

@Controller
class PromotionController 

    @RequestMapping("promo")
    public String showPromotion(@RequestParam String someRequestParam, Model model) 
        //Create the model attribute by request parameters
        Promotion promotion = Promotions.get(someRequestParam); 

        //Add the attribute to the model
        model.addAttribute("promotion", promotion); 

        if (!promotion.validate()) 
            BindingResult errors = new BeanPropertyBindingResult(promotion, "promotion");
            errors.reject("promotion.invalid");
            //TODO: This is the part I don't like
            model.put(BindingResult.MODEL_KEY_PREFIX + "promotion", errors);
        
        return 
    

这件事确实有效,但是使用 MODEL_KEY_PREFIX 和属性名称创建密钥的那部分看起来非常 hackish,对我来说不是 Spring 风格。有没有办法让同样的东西更漂亮?

【问题讨论】:

我们在哪个接口和哪个类?用什么方法? 将类和方法添加到代码中。 我不认为会有很好的方法来做到这一点。绑定验证是用来绑定和验证参数的,而不是任意的业务对象,所以如果你想这样做,它会有点乱。 嗯。因此,您建议如果我找不到具有给定参数的促销活动,我会在包含错误的模型中添加一些“字符串错误”?从来没有想过这个,因为我认为 BindingResult 是所有错误的通用容器。 【参考方案1】:

斯卡夫曼回答了问题但消失了,所以我会为他回答。

绑定验证用于绑定和验证参数,而不是任意业务对象。

这意味着,如果我需要对一些用户未提交的常规数据进行自定义验证 - 我需要添加一些自定义变量来保持该状态并且不使用 BindingResult。

这回答了我对 BindingResult 的所有问题,因为我认为它必须用作任何类型错误的容器。

再次感谢@Skaffman。

【讨论】:

不用担心。顺便说一句,如果您想发表针对特定人的评论,请在其前面加上 @username - 这样用户就会收到通知。 我需要添加一些自定义变量来保持该状态并且不使用 BindingResult。 ——我不同意。你在你的问题中显示的只是工作......

以上是关于Spring - 将 BindingResult 添加到新创建的模型属性的主要内容,如果未能解决你的问题,请参考以下文章

Spring验证的错误返回------BindingResult

java Spring验证:如何向BindingResult添加错误

为啥 BindingResult 必须遵循 @Valid?

Thymeleaf + Spring:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性

在 Spring Boot 应用程序中使用 @Valid 和 BindingResult 时的表单输入验证问题

使用 BindingResult 在 JSP 上显示错误消息