ROR*_*ROR 1 java spring spring-mvc
当使用默认的 ObjectName 时,如下所示:
model.addAttribute(myObject);
Run Code Online (Sandbox Code Playgroud)
BindingResult会将错误结果绑定到对应的输入路径,对象名为myObject。
但是如果我为我的对象使用一个新名称,如下所示:
model.addAttribute("newObjectName",myObject);
Run Code Online (Sandbox Code Playgroud)
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";
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
导入** .domain.PmiUnit; 在domain包中,pmiUnit的类名为PmiUnit。因此,如果我将 modelAttribute 名称更改为“pmiUnitObject”。(好吧,这只是我更喜欢这种方式,不喜欢具有不可更改名称的固定默认方式。而且,如果您添加多个对象,您应该能够使用像${variableName.propertyName}.jsp 中的bean )
我这样修改:
model.addAttribute("pmiUnitObject",pmiUnit);
Run Code Online (Sandbox Code Playgroud)
这是调试期间的变量 BindingResult:
……不好意思,发不了图……
不管怎样,你会看到在 bindingResult.objectName 中它仍然是“pmiUnit”,并且它不会将错误结果绑定到 jsp form:errors 标记。
您没有模型属性,只是碰巧有一个任意方法参数@Valid。除此之外,您的方法参数的顺序也存在问题。必须BindingResult直接跟在它所适用的论点之后,在您的情况下是PmiUnit论点。另请参阅参考指南的这一部分。
public final String saveUnitAdd(@Valid PmiUnit pmiUnit,BindingResult bindingResult,,Model modelHttpServletRequest httpServletRequest, HttpSession session){ ... }
Run Code Online (Sandbox Code Playgroud)
接下来@Valid添加@ModelAttribute和删除model.addAttribute呼叫。
public final String saveUnitAdd(@Valid @ModelAttribute PmiUnit pmiUnit,BindingResult bindingResult,Model model,HttpServletRequest httpServletRequest, HttpSession session){ ... }
Run Code Online (Sandbox Code Playgroud)
如果您想给它另一个名称,请将其包含在@ModelAttribute注释中。默认值是采用方法参数的名称。
public final String saveUnitAdd(@Valid @ModelAttribute("your-name-here") PmiUnit pmiUnit,BindingResult bindingResult,Model model,HttpServletRequest httpServletRequest, HttpSession session){ ... }
Run Code Online (Sandbox Code Playgroud)
我还建议删除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";
}
}
Run Code Online (Sandbox Code Playgroud)