不允许进行现场验证

时间:2010-10-24 08:29:52

标签: java spring-mvc validation

我是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函数上设置)?

1 个答案:

答案 0 :(得分:4)

没有好办法。

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<?>>,并且将这些ConstraintViolation放入BindingResult的代码深埋在Spring internals并且不能轻易重用(参见SpringValidatorAdapter)。

@Valid - 样式方法(SPR-6373)中使用修订版3.1支持验证组的功能请求。

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