【问题标题】:BindingResult doesn't work after change ModelAttribute name更改 ModelAttribute 名称后 BindingResult 不起作用
【发布时间】:2014-06-16 12:47:08
【问题描述】:

当像这样使用默认 ObjectName 时:

model.addAttribute(myObject);

BindingResult会将错误结果绑定到对应的输入路径,其对象名称为myObject。

但是,如果我像这样为我的对象使用新名称:

model.addAttribute("newObjectName",myObject);

BindingResult 仍会将其对象名称设置为 myObject,而不是“newObjectName”,并且结果错误不会被绑定。

那么,有什么方法可以在不将模型对象名称更改为默认值的情况下使 BindingResult 工作?

我的控制器

@RequestMapping(value="unit/unitAdd.do", method=RequestMethod.POST)
    public final String saveUnitAdd(@Valid PmiUnit pmiUnit,Model model,BindingResult bindingResult,HttpServletRequest httpServletRequest,
            HttpSession session){
    logger.info("saveAddUnit called!");
    boolean exists = unitService.isAlreadyExists("pmi_units",   "uni_unit_name_pk",pmiUnit.getUniUnitNamePk());
    if (exists) {
        //exists and without state DEL, return exists error
        logger.info("Unit Name_PK exists");
        if(!unitService.isExistsAndDeleted("pmi_units", "uni_unit_name_pk",pmiUnit.getUniUnitNamePk())){
            System.out.println("exists and not deleted");
            bindingResult.rejectValue("uniUnitNamePk", "pmi.validator.constraints.unique");}
        //exists but with state DEL, update this row
        else{
            unitService.updateDeletedUnit(pmiUnit);
            mainService.getDefaultPmiUnit(pmiUnit, model);
            httpServletRequest.setAttribute("fromAddUnit", "true");
            httpServletRequest.setAttribute("addResult", "true");
            model.addAttribute("pmiUnit",pmiUnit);
            return "accessControl1/unit/unitManage";
        }
    }
    //if has errors, return the same page
    if (bindingResult.hasErrors()) {
        model.addAttribute("pmiUnit",pmiUnit);
        return "accessControl1/unit/unitAdd";
    }

JSP 部分

<form:form method="POST" id="pmiAddUnit" name="pmiAddUnit"
            modelAttribute="pmiUnit" enctype="multipart/form-data"
            action="unitAdd.do">
...
<table>
    <tr>
    <td align="left"><form:input id="uniUnitNamePk" name="uniUnitNamePk" path="uniUnitNamePk" class="margin-right-ten" /></td>
    <td align="left"><form:errors class="error" path="uniUnitNamePk" /></td>
    </tr>
</table>
...
</form:form>

导入 **.domain.PmiUnit; 在域包中,pmiUnit 的类名为 PmiUnit。 因此,如果我将 modelAttribute 名称更改为“pmiUnitObject”。(嗯,只是我更喜欢这种方式,不喜欢名称不可更改的固定默认方式。而且,如果您添加多个对象,您应该可以使用.jsp 中的 ${variableName.propertyName} 之类的 bean)

我是这样修改的:

model.addAttribute("pmiUnitObject",pmiUnit);

这是调试过程中的变量 BindingResult:

..尴尬,无法发布图片....

不管怎样,在bindingResult.objectName中你会看到它仍然是“pmiUnit”,它不会将错误结果绑定到jsp form:errors标签中。

【问题讨论】:

  • 发布您的方法签名,以及为什么要将对象(再次)添加到模型中,因为由于@ModelAttribute 注释,它应该已经存在。
  • 请出示方法代码

标签: java spring spring-mvc


【解决方案1】:

您没有模型属性,只是碰巧有一个带有@Valid 的任意方法参数。除此之外,您的方法参数的顺序也存在问题。 BindingResult 必须直接跟在它适用的参数之后,在您的情况下是 PmiUnit 参数。另请参阅参考指南的this section

public final String saveUnitAdd(@Valid PmiUnit pmiUnit,BindingResult bindingResult,,Model modelHttpServletRequest httpServletRequest, HttpSession session){ ... }

@Valid 旁边添加@ModelAttribute 并删除model.addAttribute 调用。

public final String saveUnitAdd(@Valid @ModelAttribute PmiUnit pmiUnit,BindingResult bindingResult,Model model,HttpServletRequest httpServletRequest, HttpSession session){ ... }

如果您想给它另一个名称,请将其包含在 @ModelAttribute 注释中。默认是采用方法参数的名称。

public final String saveUnitAdd(@Valid @ModelAttribute("your-name-here") PmiUnit pmiUnit,BindingResult bindingResult,Model model,HttpServletRequest httpServletRequest, HttpSession session){ ... }

我还建议删除HttpServletRequest 参数并简单地添加要添加到模型的属性。我可能会将该方法重写为以下内容(也不确定为什么您仍然在其中还有HttpSession?)。

@RequestMapping(value="unit/unitAdd.do", method=RequestMethod.POST)
public final String saveUnitAdd(@Valid @ModelAttribute("pmiUnitObject) PmiUnit pmiUnit, BindingResult bindingResult, Model model, HttpSession session){
    logger.info("saveAddUnit called!");
    boolean exists = unitService.isAlreadyExists("pmi_units", "uni_unit_name_pk",pmiUnit.getUniUnitNamePk());
    if (exists) {
        //exists and without state DEL, return exists error
        logger.info("Unit Name_PK exists");
        if(!unitService.isExistsAndDeleted("pmi_units", "uni_unit_name_pk",pmiUnit.getUniUnitNamePk())) {
            System.out.println("exists and not deleted");
            bindingResult.rejectValue("uniUnitNamePk", "pmi.validator.constraints.unique");}
            //exists but with state DEL, update this row
        }
    }

    if (!bindingResult.hasErrors() ) {
        unitService.updateDeletedUnit(pmiUnit);
        mainService.getDefaultPmiUnit(pmiUnit, model);
        model.addAttribute("fromAddUnit", "true");
        model.addAttribute("addResult", "true");
        return "accessControl1/unit/unitManage";
    } else {
        return "accessControl1/unit/unitAdd";
    }

}

【讨论】:

  • 酷,谢谢。我是初学者-.-确实有效..我应该检查有效和模型属性之间的区别
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 2022-07-15
  • 2016-01-09
  • 1970-01-01
相关资源
最近更新 更多