Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BindingResult不';更改ModelAttribute名称后无法工作_Java_Spring_Spring Mvc - Fatal编程技术网

Java BindingResult不';更改ModelAttribute名称后无法工作

Java BindingResult不';更改ModelAttribute名称后无法工作,java,spring,spring-mvc,Java,Spring,Spring Mvc,使用默认ObjectName时,如下所示: model.addAttribute(myObject); model.addAttribute("newObjectName",myObject); model.addAttribute("pmiUnitObject",pmiUnit); BindingResult将错误结果绑定到相应的输入路径,其对象名为myObject 但是如果我对我的对象使用了一个新名称,比如: model.addAttribute(myObject); model.a

使用默认ObjectName时,如下所示:

model.addAttribute(myObject);
model.addAttribute("newObjectName",myObject);
model.addAttribute("pmiUnitObject",pmiUnit);
BindingResult将错误结果绑定到相应的输入路径,其对象名为myObject

但是如果我对我的对象使用了一个新名称,比如:

model.addAttribute(myObject);
model.addAttribute("newObjectName",myObject);
model.addAttribute("pmiUnitObject",pmiUnit);
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>
这是调试期间的变量BindingResult:

…笨拙,无法发布图像


无论如何,您将在bindingResult.objectName中看到它仍然是“pmiUnit”,并且它不会将错误结果绑定到jsp form:errors标记。

您没有模型属性,只是碰巧有一个带有
@Valid
的任意方法参数。除此之外,在方法参数的顺序上也有问题。
BindingResult
必须直接跟在它所应用的参数后面,在您的例子中是
PmiUnit
参数。另请参见参考指南的第1部分

public final String saveUnitAdd(@Valid PmiUnit pmiUnit,BindingResult bindingResult,,Model modelHttpServletRequest httpServletRequest, HttpSession session){ ... }
@Valid
旁边添加
@modeldattribute
并删除
model.addAttribute
调用

public final String saveUnitAdd(@Valid @ModelAttribute PmiUnit pmiUnit,BindingResult bindingResult,Model model,HttpServletRequest httpServletRequest, HttpSession session){ ... }
如果要给它另一个名称,请将其包含在
@modeldattribute
注释中。默认值是采用方法参数的名称

public final String saveUnitAdd(@Valid @ModelAttribute("your-name-here") PmiUnit pmiUnit,BindingResult bindingResult,Model model,HttpServletRequest httpServletRequest, HttpSession session){ ... }
我还建议删除
HttpServletRequest
参数,只需添加要添加到模型中的属性。我可能会将该方法重写为以下内容(也不确定为什么仍然有
HttpSession


您没有模型属性,只是碰巧有一个带有
@Valid
的任意方法参数。除此之外,在方法参数的顺序上也有问题。
BindingResult
必须直接跟在它所应用的参数后面,在您的例子中是
PmiUnit
参数。另请参见参考指南的第1部分

public final String saveUnitAdd(@Valid PmiUnit pmiUnit,BindingResult bindingResult,,Model modelHttpServletRequest httpServletRequest, HttpSession session){ ... }
@Valid
旁边添加
@modeldattribute
并删除
model.addAttribute
调用

public final String saveUnitAdd(@Valid @ModelAttribute PmiUnit pmiUnit,BindingResult bindingResult,Model model,HttpServletRequest httpServletRequest, HttpSession session){ ... }
如果要给它另一个名称,请将其包含在
@modeldattribute
注释中。默认值是采用方法参数的名称

public final String saveUnitAdd(@Valid @ModelAttribute("your-name-here") PmiUnit pmiUnit,BindingResult bindingResult,Model model,HttpServletRequest httpServletRequest, HttpSession session){ ... }
我还建议删除
HttpServletRequest
参数,只需添加要添加到模型中的属性。我可能会将该方法重写为以下内容(也不确定为什么仍然有
HttpSession


发布方法签名,以及为什么要(再次)将对象添加到模型中,因为由于
@modeldattribute
注释,对象应该已经存在。请显示方法代码发布方法签名,以及为什么要(再次)添加对象由于
@modeldattribute
注释,模型应该已经存在。请显示方法codeCool,谢谢。我是一个初学者-真的有用。。我应该检查一下valid和ModelAttributeCol之间的差异,谢谢。我是一个初学者-真的有用。。我应该检查valid和modelattribute之间的差异