2013-07-25 45 views
0

我有一個用戶輸入其社會安全號碼(用戶ID)的輸入字段。此編號必須採用特定格式,因此我使用自定義轉換器正確格式化。之後,該號碼將針對數據庫進行檢查。 當檢查失敗時,我希望數字以用戶輸入用戶體驗的方式顯示。但轉換在檢查之前,並且後臺bean中的用戶標識設置爲轉換後的值,原始數字將丟失。什麼是保存原始價值的最佳方式?JSF在轉換前保存輸入值

<h:inputText id="userId" value="#{bean.userId}"> 
    <f:converter converterId="IdConverter" /> 
</h:inputText> 
+0

在你的驗證器,這樣的UI組件上使用的getValue ....對象屬性oldValue =((UIInput)uiComponent).getValue(); – rags

+0

你的意思是在我的轉換器? –

+0

如果是這樣,我該如何返回轉換價值和舊價值? –

回答

1

如果我正確理解你的問題,那麼你不需要保存原始值。利用JSF生命週期。

除了自定義轉換器,您還需要一個自定義驗證器。在您的驗證器中,如果轉換後的輸入和db上的數據之間的檢查成功,那麼您的自定義轉換器的getAsString將簡單地返回轉換後的輸入。但是,如果轉換成功,但驗證失敗(意味着對數據庫記錄的檢查不成功),那麼您將簡單地拋出一個ValidatorException。將不會調用getAsString,並顯示原始輸入。

我有兩種方法可以考慮如何實現這一點。對於第一種方法,您可以在您的bean中定義一個驗證器方法,並在該方法中移動驗證邏輯。例如:

public class Bean {  
    //Remainder omitted 

    public void validate(FacesContext fc, UIComponent uic, Object o) { 
     //Get the converted input. Assuming of type String 
     String convertedInput = (String) o; 

     //Move the db check in this method. If it fails simply throw 
     //a ValidatorException like below. If it succeeds, don't return anything 

     //throw new ValidatorException(new FacesMessage("Validation Failed")); 
    } 
} 

請注意返回類型和參數。

然後,你將在<h:inputText>像這樣

<h:inputText id="userId" value="#{bean.userId}" validator="#{bean.validate}"> 

一個優點添加validator屬性用這種方法,這種方法將能夠訪問Bean類的其他實例變量,但作爲一個缺點,它便攜性較差。

另一種方法是讓一個單獨的類實現接口Validator。例如:

@FacesValidator("customValidator") 
public class MyValidator implements javax.faces.validator.Validator { 

    @Override 
    public void validate(FacesContext fc, UIComponent uic, Object o) { 
     //Same logic as bean validator method 
    } 
} 

然後在你的<h:inputText>

<f:validator validatorId="customValidator" /> 

您的問題增加似乎表明缺乏對JSF生命週期的理解。我強烈建議你花時間儘可能多地理解這個概念。您可能無法一次理解它,但隨着您更多地參與JSF,某些方面會變得更加清晰。這裏是一個開始的好地方。

Debug JSF lifecycle