2013-07-05 81 views
4

我有這樣一個地址實體:如果實體的所有字段都爲空,如何跳過bean驗證?

@Entity 
public class Address implements java.io.Serializable { 
    @Id @GeneratedValue(strategy = IDENTITY) 
    private Long id; 

    @Size(max = 100) 
    private String street; 

    @Size(max = 15) 
    private String nr; 

    @Field 
    @Size(min = 1, max = 20) @NotBlank 
    private String city; 
} 

這是其他幾個實體的一部分。對於一個這樣的實體,地址是可選的。 我有一個視圖,我們的用戶可以通過幾個表單輸入來編輯整個實體,包括幾個地址字段。

爲了能夠編輯地址,我使用空地址實體初始化父實體。

現在的問題是:當所有地址字段都爲空時,我不想在實體上堅持Address。爲了達到這個目的,我需要在Address的所有字段都爲空的情況下跳過驗證。我如何以最優雅的方式做到這一點?

我現在正在做的是完全跳過bean驗證,<o:validateBean disabled="true" />用於提交按鈕,如果地址爲空,則將地址設置爲null。但這聽起來像是一個徹頭徹尾的破解,因爲它禁用所有驗證在所有個案。我該如何做得更好?

回答

4

你可以使用EL在<f:validateBean>(和<o:validateBean>disabled屬性。您可以使用EL來檢查是否有任何這些字段已被填寫。您可以使用binding屬性來引用EL中的組件。您可以通過檢查與組件的客戶端ID相關聯的請求參數的值來檢查是否填充了字段。

然後,對這些領域的禁用Bean驗證時#{addressIsEmpty}評估true,它更容易使用<f:validateBean>,而不是作爲<o:validateBean>前者可用於包裝多個輸入組件。

因此,所有的一切,這應該這樣做:

<c:set var="addressIsEmpty" value="#{empty param[street.clientId] and empty param[nr.clientId] and empty param[city.clientId]}" /> 

<f:validateBean disabled="#{addressIsEmpty}"> 
    <h:inputText binding="#{street}" value="#{bean.address.street}" /> 
    <h:inputText binding="#{nr}" value="#{bean.address.nr}" /> 
    <h:inputText binding="#{city}" value="#{bean.address.city}" /> 
</f:validateBean> 

<o:validateBean>只是比較容易,如果你打算控制它在每個輸入或每個命令的基礎上使用。

+0

綁定技巧非常棒,謝謝! – mabi

+0

雖然檢查'param'值工作得很好,但我不得不使用id的字符串值(我控制命名容器和輸入的id),在嘗試時使用'clientId'給了我一個NullPointerException評估EL。這可能是因爲這些值處於有條件呈現的彈出窗口中? – mabi

+0

這是什麼'null'? – BalusC

0

多個字段的交叉驗證可能是一個棘手的問題。但是在這種情況下,它並不是驗證本身,它首先會讓您感到困擾,但在您堅持實體之前,可能會在bean的某些情況下取消某些實例的可能性。

最直接的方法是將與Address實體關聯的所有字段標記爲required="false"在您的視圖中不要關注字段被填充(或者只是省略它,因爲它是默認值)並執行所有檢查和修改在調用EJB服務之前,在action方法中佔位符。像這樣:

public String save() { 
    //do some checks 
    if((entity.getAddress().getStreet() == null) && ...) { 
     //assign address to null 
     entity.setAddress(null); 
    } 
    entityService.persist(entity); 
    return "success"; 
} 
+0

問題在於JSF默認會執行Bean Validation,即使這些字段是'required = false'(它們在我的代碼中)。如果驗證失敗,即使完全合理,也意味着我的'save'永遠不會被調用。 – mabi

+0

是的,這是一個好點!像往常一樣,BalusC的回答讓我們再次走上了正確的軌道。 – skuntsel

相關問題