form:错误不会在jsp上呈现

时间:2015-04-13 22:24:17

标签: java validation spring-mvc hibernate-validator spring-form

我有以下控制器:

@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是真的

但是当我看到渲染页面时,我看不到错误消息  有什么问题?

1 个答案:

答案 0 :(得分:0)

正如我之前在my answer中所说的那样,这不是Spring MVC验证的工作方式。

Spring MVC带来了很多魔力......只要你遵守它的规则。要使<form:errors .../>代码生效,您必须在响应中绑定Errors对象并绑定ModelAttribute对象。如果您在模型属性之后立即放置一个BindingResult作为方法参数,则会自动发生(请参阅ref ed answer)

不幸的是,当你这样做时,Spring将验证每个字段,这不是你想要的,没有任何简单的方法可以忽略某些字段的错误。所以你可以:

  • 通过@InitBinder注释方法没有自动验证器
  • 和其中之一
    • 通过手动验证(或取决于您的 violation )明确拒绝字段 - 有点手动,但功能强大的方法
    • 在JSR-303验证器周围使用SpringValidatorAdapter,因为它可以通过其SmartValidator接口使用验证组作为验证提示,并在控制器中明确调用其方法void validate(Object target, Errors errors, Object... validationHints)

无论如何,我强烈建议您不要为每个请求创建验证器,而是将其创建为bean并将其注入控制器。