【问题标题】:form:errors doesn't render on jsp表单:错误不会在 jsp 上呈现
【发布时间】:2015-04-13 22:24:16
【问题描述】:

我有以下控制器:

@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() &gt; 0 是真的

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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-03-13
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多