我有以下控制器:
@RequestMapping(value = "/member/createCompany/addParams", method = RequestMethod.POST)
public String setCompanyParams(
@ModelAttribute MyDto myDto,
@RequestParam(value = "g-recaptcha-response") String recapchaResponse,
HttpSession session, Principal principal, Model model) throws Exception {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<MyDto>> violations;
if(condition1){
violations = validator.validate(myDto, ValidationGroup1.class);
} else {
violations = validator.validate(myDto);
}
if (violations.size() > 0) {
return "member/createCompany/addParams";
}
...
}
MyDto课程:
class MyDto {
@NotEmpty
String companyName;
@NotEmpty(groups = ValidationGroup1.class)
String generatedPassword;
}
并遵循jsp:
<form:form commandName="myDto" id="addParams" action="/member/createCompany/addParams" method="POST">
<form:errors cssClass="error" path="companyName"/><br/>
<form:input type="text" id="companyName" path="companyName" name="companyName" maxlength="255" value="${campaign.campaignName}"/><br/>
<form:errors cssClass="error" path="generatedPassword"/><br/>
<form:input path="generatedPassword" type="text" id="generatedPassword" name="generatedPassword" value="${generatedPassword}" />
...
</form:form>
当我提交表格时,我看到了
violations.size() > 0
是真的
但是当我看到渲染页面时,我看不到错误消息 有什么问题?
答案 0 :(得分:0)
正如我之前在my answer中所说的那样,这不是Spring MVC验证的工作方式。
Spring MVC带来了很多魔力......只要你遵守它的规则。要使<form:errors .../>
代码生效,您必须在响应中绑定Errors
对象并绑定ModelAttribute
对象。如果您在模型属性之后立即放置一个BindingResult
作为方法参数,则会自动发生(请参阅ref ed answer)
不幸的是,当你这样做时,Spring将验证每个字段,这不是你想要的,没有任何简单的方法可以忽略某些字段的错误。所以你可以:
violation
)明确拒绝字段 - 有点手动,但功能强大的方法SpringValidatorAdapter
,因为它可以通过其SmartValidator
接口使用验证组作为验证提示,并在控制器中明确调用其方法void validate(Object target,
Errors errors,
Object... validationHints)
。无论如何,我强烈建议您不要为每个请求创建验证器,而是将其创建为bean并将其注入控制器。