2017-02-18 101 views
0

據我所知,在JEE7 Bean驗證自動與CDI集成。 例如,如果我使用CDI容器,我不需要注入並使用javax.validation.Validator來檢查我的bean是否違反了某些約束。 所以,我不需要做這樣的事情:覆蓋或禁用CDI與Bean驗證集成

@Inject 
Validator validator; 

... 

SoccerPlayer player = new SoccerPlayer(); 
    player.setFirstName(firstName); 
    player.setLastName(lastName); 
    player.setAge(age); 

Set<ConstraintViolation<SoccerPlayer>> violations = validator 
      .validate(player); 

但下面SoccerPlayer豆

public class SoccerPlayer { 

@NotNull 
@Size(min = 5) 
private String firstName; 

@NotNull 
@Size(min = 5) 
private String lastName; 

@Max(50) 
@Min(value=16, groups = GoalKeeper.class) 
private int age; 

private String position; 

public SoccerPlayer() { 
} 

// Getters and setters omitted 
} 

可以用@Valid註釋自動驗證。

public class SoccerPlayerProcessor {  

    public void processPlayer(@Valid SoccerPlayer player){ 
     // Do stuff with the player. 
    } 
} 

現在,在這種情況下,我不能一起選擇使用組,@Valid註釋,多元化的驗證行爲。

那麼,有什麼方法可以實現我的目標嗎? 或者作爲替代方案,我可以禁用CDI與bean驗證集成嗎?我可以用我的自定義實現覆蓋默認的CDI javax.validation.Validator嗎?

我正在使用WebSphere Liberty概要文件作爲應用程序服務器。

預先感謝您。

EDIT

更準確,這是來自提取物:https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/validator-integration.html#section-integration-with-cdi

作爲版本1.1,Bean驗證集成有CDI(上下文 和依賴注入的JavaTM EE )。

這種集成提供了CDI管理豆驗證和 ValidatorFactory,使依賴注入在約束 驗證以及自定義消息插值,穿越 解析器,約束驗證工廠和參數名稱 提供商。

此外,在調用 時,將自動驗證CDI託管bean的構造函數的方法和 上的參數和返回值約束。

當您的應用程序在Jave EE容器上運行時,默認情況下啓用此集成。

我的問題是,是否有任何方法來禁用此默認行爲?或者可以替代我可以重寫默認的CDI攔截器?或者是不可能的?

+0

你是什麼意思?「我不能使用組合與@ @ Valid'註解」? – Rouliboy

+0

我的意思是如果我想用GoalKeeper.class組驗證SoccerPlayer呢? AFAIK我不能做像@Valid(groups = GoalKeeper.class)。如果我可以重寫默認的驗證器,我可以使用自定義註釋(例如Validate,其中包含組字段@Validate(groups = GoalKeeper.class))對我的API進行註釋,並且在驗證程序中我可以收集所有使用它註釋的bean並執行驗證特定組。 – mancioshell

回答

1

嘗試使用@ConvertGroup來達到預期的效果。

基於你之前的例子,代碼看起來像這樣。

public class SoccerPlayerProcessor {  

    public void processPlayer(@Valid @ConvertGroup(from=Default.class, to=GoalKeeper.class) SoccerPlayer player){ 
     // Do stuff with the player. 
    } 

如果你需要一個以上的@ConvertGroup,使用@ConvertGroup.List容納多個@ConvertGroup註解相同的元素。

+0

我建議在單元測試中使用validator.forExecutables()。validateParameters(..)方法來檢查,如果您的驗證正常工作。 –