0

我有以下控制器:

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

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

4

1 回答 1

0

正如我在上一个问题的回答中所说,这不是 Spring MVC 验证的工作方式。

Spring MVC 带来了很多魔力……只要你遵循它的规则。为了使<form:errors .../>标签起作用,您必须Errors在响应中拥有一个与该对象相关联的ModelAttribute对象。如果您BindingResult在模型属性之后立即将一个作为方法参数,它会自动发生(请参阅参考答案

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

  • 不通过 @InitBinder 注释方法放置自动验证器
  • 并且要么
    • 通过进行手动验证(或取决于您的violation)明确拒绝字段 - 有点手动,但强大的方法
    • 在您的 JSR-303 验证器周围使用 a SpringValidatorAdapter,因为它可以通过其接口使用验证组作为验证提示,并在您的控制器中SmartValidator显式调用其方法。void validate(Object target, Errors errors, Object... validationHints)

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

于 2015-04-14T17:40:26.350 回答