2013-02-11 63 views
1

我想将注释的验证规则与一些自定义验证一起使用。我有一个细节实体,如下所示:使用自定义验证程序时弹出验证注释被忽略

public class DetailsEntity {  
    @NotEmpty(message = "Name is required") 
    private String name; 
    private String customField; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getCustomField() { 
     return customField; 
    } 

    public void setCustomField(String customField) { 
     this.customField = customField; 
    } 
} 

然后我有一个控制器,它看起来像这样:

@Controller 
public class EntityController { 

    @RequestMapping(value = "/create", method = RequestMethod.POST) 
    public @ResponseBody DetailsEntity create(@RequestBody @Valid 
     DetailsEntity details) { 
     //Do some creation work 
    } 
} 

这一切的伟大工程开箱。问题是当我尝试与我的实体一起使用自定义验证器时。我的验证器看起来像这样:

@Component 
public class EntityValidator implements Validator { 

    @Override 
    public boolean supports(Class<?> aClass) { 
     return aClass.isAssignableFrom(DetailsEntity.class); 
    } 

    @Override 
    public void validate(Object o, Errors errors) { 
     DetailsEntity entity = (DetailsEntity) o; 
     if (entity.getCustomField().equals("Some bad value")) { 
      errors.reject("Bad custom value supplied"); 
     } 
    } 
} 

我已经尝试了注入验证器两种方式。一种是在控制器中使用@InitBinder,另一种是在弹簧配置中设置全局验证器(<mvc:annotation-driven validator="entityValidator" />)。无论哪种方式,我这样做,自定义验证工作正常,但我的@NotEmpty注释被忽略。我如何使用注释以及自定义验证器?

回答

2

使用SpringValidatorAdapter作为基类的自定义验证和覆盖validate()方法:

public void validate(Object target, Errors errors) { 
       // check JSR-303 Constraints 
     super.validate(target, errors); 
       // Add you custom validation here. 

    } 

或注入一个LocalValidationFactoryBean在您自定义的验证之前或自定义的验证后调用验证(目标,错误) 。

+0

这让我走下正确的道路,最终看着这个页面:http://nonrepeatable.blogspot.com/2010/04/using-jsr-303-with-classic-spring.html – 2013-02-11 19:40:20

+0

我会补充说如果想要使用组验证,则组必须添加到验证方法中。否则,这些验证不会执行! – jarandaf 2013-07-08 10:13:30

0

@NotEmpty是一个JSR-303注释,我们需要像HiberanteValidator一样使用它的实现,我们需要添加Hibernate-Validator jar到你的lib目录。使用这个jar我们可以使用@NotEmpty,@NotNull ...所有的JSR 303注解。