2013-02-11 60 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註解。