2015-06-10 27 views
2

比方說,我有一個有3個成員等級:使用@NonNull檢查類成員也

Class A { 
    private String string1; /** Cannot be null */ 
    private String string2; /** Cannot be null */ 
    private String string3; /** Can be null */ 
} 

我有2個方法接受這個類作爲參數的對象。其中一個方法需要檢查非可空字段存在,而在另外一個,也沒關係:

public int func1(A object); /** Check non nullable fields */ 
public int func2(A object); /** No check required */ 

有沒有乾淨的方式做到這一點?使用@NonNull註釋什麼的?

我嘗試了各種方法,但都沒有工作。所有的NonNull只有幫助確保setter不會作爲參數獲得null。或者該對象本身不是空的。

我似乎無法找到對對象進行這種遞歸空檢查的東西。

如果你們中的任何人都能幫忙,那將會很棒。 :)

+0

如果確保'A'不可變,'string1'和'string2'上的'@ NonNull'就足夠了。 – Magnilex

+0

不能這樣做。 :) – SinnerShanky

+0

這聽起來像春季AOP的經典案例 – summerbulb

回答

0

使用@Required標註在Spring's

private String string1; 

@Required 
public void setString1(String string1) { 
    this.string1= string1; 
} 
+0

在使用它時,每次調用此方法時都會檢查所有字段是否存在? – SinnerShanky

+0

不是所有的字段,只有你要添加的特定字段需要註釋 – Arjit

+0

這需要hibernate驗證器,否? – John

1
class A { 
    @NotNull 
    private String string1; /** Cannot be null */ 
    @NotNull 
    private String string2; /** Cannot be null */ 
    private String string3; /** Can be null */ 
} 

而且在方法簽名具有@Valid

public int function(@Valid A object) 
+0

@Valid是哪個lib的一部分? Java 8還是Spring?似乎無法在eclipse中導入它。 – SinnerShanky

+1

javax.validation validation-api John

+0

我正在使用JDK8。找不到javax.validation。我認爲它在這個版本中被刪除了。 – SinnerShanky

1

你需要一個bean Validator,用來檢查bean是一個類好。在Spring中有很多實現。例如,請參閱SmartValidatorLocalValidatorFactoryBean

@valid註釋是自動調用驗證程序的好方法。在使用Spring時,您可以避免手動創建驗證器。它只在Spring(或任何等效容器)調用方法時纔有效。您可以在BindingResult對象中獲得驗證結果。例如:

@RequestMapping(value = "/MyPath", method = RequestMethod.POST) 
public String postCostForm(Model model, @Valid MyForm myForm, BindingResult result){       
     if(result.hasErrors()){    
      for(ObjectError error : result.getAllErrors()){ 
        // Do something 
      }        
      return "/error"; 
     }else{ 
      return "/success"; 
     } 
} 

驗證功能非常強大,有時很複雜。您可以創建驗證組並僅檢查其中的一組。您可以創建自定義約束標記,您可以調用驗證方法,並且可以在驗證失敗時自定義和返回消息國際化。

+0

我正在尋找替代方案。明確定義驗證器是一個選項,但我想遠離它。 – SinnerShanky

+0

好的。如果有幫助,我會改進答案 – borjab