2014-11-05 51 views
3

我在當前項目中使用了OmniFaces<o:viewParam> taghandler。我喜歡它,它很棒。而更大的是<o:viewParamValidationFailed>。現在,如果驗證或轉換失敗,我們可以發送錯誤。但我想知道,是否有可能區分轉換失敗和驗證失敗。區分o中的轉換失敗和驗證失敗:viewParamValidationFailed

假設我們想發送一個錯誤請求如果給定的視圖參數格式不正確,無法轉換;那麼發送一個未找到如果轉換成功,但在數據庫中找不到該對象;並且如果成功獲取的對象不應該被用戶訪問,則發送禁止的

有沒有人知道一種方法來實現這一目標?

回答

4

無法區分ConverterExceptionValidatorException,只有UIInput#isValid()在手中。理論上,您可以檢查並測試faces消息以查看它是否代表轉換或驗證錯誤,但這不是一種可靠的方法,當然不是在本地化時。

另一方面,可以使用相同的參數名稱聲明多個視圖參數。您不一定需要指定value將其設置爲模型值。

下面是根據您的描述爲例,注意,模型值僅在最後一集:

<o:viewParam name="foo"> 
    <f:converter converterId="yourFooConverter" /> 
    <o:viewParamValidationFailed sendError="400" /> 
</o:viewParam> 
<o:viewParam name="foo"> 
    <f:converter converterId="yourFooConverter" /> 
    <f:validateRequired /> 
    <o:viewParamValidationFailed sendError="404" /> 
</o:viewParam> 
<o:viewParam name="foo" value="#{bean.foo}"> 
    <f:converter converterId="yourFooConverter" /> 
    <f:validateRequired /> 
    <f:validator validatorId="yourRestrictedAccessValidator" /> 
    <o:viewParamValidationFailed sendError="403" /> 
</o:viewParam> 

爲了避免調用數據庫的每次轉換昂貴的工作,讓YourFooConverter執行商店轉換後的值作爲FacesContext的自定義屬性,然後在每次傳遞時檢查它。

+0

它的工作原理。做得好。我已經嘗試過這種方法,但錯過了在每個viewParam標記處理器中指定轉換器。 – darefilz 2014-11-08 12:26:10

+0

我剛剛寫了這個優化(存儲轉換後的值作爲自定義屬性),但顯然給定的'UIComponent'是每個過程的'o:viewParam',因此不一致。我只是將該值添加到給定的'FacesContext'中,它在所有測試中都能正常工作。有沒有理由不這樣做? – darefilz 2014-11-19 21:34:19