【问题标题】:disallowed field validation不允许的字段验证
【发布时间】:2011-04-29 18:47:47
【问题描述】:

我是 Spring 框架的新手。我目前正在构建一些新闻经理表单。

这里是我的新闻实体的示例:

class News
{
    @NotNull
    long id;
    @NotNull
    long idAuthor;
    @Size(max=255)
    String content;
}

如您所见,我在 Spring 中使用 JSR303 注释验证。我想验证我的“新闻编辑表单”。

@RequestMapping( value = "/edit" , method = RequestMethod.POST)
    public String editAction(@Valid @ModelAttribute News news, BindingResult result)
    {   
        System.err.println(result.hasErrors());
          ...
            return "editView";
    }

定义允许的字段:

//initBinder function :
     binder.setAllowedFields("content");

好吧,我正在尝试仅验证“内容”字段(在我的活页夹上设置了允许的字段)......但是 Spring 总是验证我的实体上定义的所有字段(所以“id”和“idAuthor”返回错误)

我怎样才能只验证允许的字段(在 initBinder 函数上设置)?

【问题讨论】:

  • 我是否必须创建一个只有“内容”字段的特殊实体??

标签: java spring-mvc validation


【解决方案1】:

没有好办法。

JSR-303 提供了两种选择性验证方法:

  • 您可以通过调用validator.validateProperty(news, "content") 来验证特定属性
  • 您可以定义验证组:

    @Size(max=255, groups = {Default.class, WebValidation.class})      
    String content; 
    

    并验证指定组:validator.validate(news, WebValidation.class);

Spring MVC 不直接支持这些方法。您可以自动装配 JSR-303 Validator 并手动调用这些方法,但它们会返回 Set<ConstraintViolation<?>>,并且将这些 ConstraintViolations 放入 BindingResult 的代码深埋在 Spring 内部内部并且不容易重复使用(参见SpringValidatorAdapter)。

有一个功能请求以支持 @Valid 样式方法 (SPR-6373) 中的验证组,修复版本为 3.1。

因此,除了创建一个特殊的 DTO 类之外,您没有太多选择:您可以使用手动验证(不使用 JSR-303),或者您可以将 SpringValidatorAdapter 中的代码复制粘贴到您自己的实用程序方法中并手动调用JSR-303Validator的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多