2012-12-06 29 views
0

以下的facelet代碼,當僱員inputText組件失去焦點,成功地執行這使得消息...爲什麼我的SessionScoped ManagedBean在一個地方顯示正常而在另一個地方顯示爲空?

<h:inputText id="employeeId" value="#{questionAnswerAction.questionAnswerActionForm.employeeId}" 
required="true" requiredMessage="#{app:requiredFieldMessage(bundle, 'label.peoplesoftId')}" 
binding="#{questionAnswerAction.questionAnswerActionForm.employeeIdInputText}"> 
    <f:ajax event="blur" render="employeeIdMessage" /> 
</h:inputText> 
<h:message id="employeeIdMessage" errorClass="deg-msg-error" infoClass="deg-msg-info" for="employeeId"></h:message> 

出於某種原因,不過,當我嘗試應用只是另一個的facelet相同的代碼(區別在於它是用於managerId而不是employeeId),當發生了在ajax調用中觸發的setter(上述調用中的setEmployeeId)時,我的SessionScoped ManagedProperty在方法中被標記爲null。 ManagedProperty實際上是一個SessionScoped ManagedBean本身。

想不通爲什麼這個代碼在一個頁面上工作正常,但隨後在另一facelet裏當「設置」發生ManagedProperty被顯示爲空...

+1

不確定是否在這種特殊情況下,因爲提供的信息不在SSCCE flavor中,而是在比請求範圍更廣泛的bean上使用'binding'屬性是JSF狀態問題的配方(物理上現在,同一個組件在同一個會話中的多個請求/視圖之間共享!)。擺脫它或將其重新綁定到請求作用域bean並重試。 – BalusC

+0

@BalusC - 該綁定屬性位於SessionScoped bean的UIInput字段中。然後將UIInput字段傳遞給一個方法,該方法將FacesContext消息添加到指定的UIComponent(在這種情況下,它是UIInput字段)。這有什麼區別嗎? –

+0

@BalusC - 設置管理bean爲RequestScoped修復它...這很奇怪,因爲當我將我的員工託管bean設置爲SessionScoped時,ajax功能開始工作......對此背後原因的任何想法? –

回答

1

binding屬性會導致問題時綁定到範圍比請求範圍更廣泛的bean的屬性(例如會話範圍),因爲您基本上在整個會話中跨多個頁面包含,頁面視圖和瀏覽器選項卡/窗口在物理上共享相同的JSF組件狀態。擺脫它或重新綁定到請求範圍的bean。

的UIInput字段然後被傳遞給,增加了一個FacesContext消息發送到指定的UIComponent(在這種情況下,它的UIInput字段

只需使用一個正常ValidatorConverter取決於一個方法並將其註冊到組件上,如果您拋出ValidatorExceptionConverterException,則被包裝的FacesMessage將自動結束在正確的位置,這樣您就不再需要組件綁定了。

設置管理器bean被RequestScoped固定它...這很奇怪,因爲當我把我的員工管理的Bean被SessionScoped,AJAX功能開始工作

這是由點回答在commandButton/commandLink/ajax action/listener method not invoked or input value not updated中的4和5。

+0

有道理 - 謝謝。 –

+0

你知道我如何通過驗證器顯示成功消息嗎?我想爲我的組件使用h:message標記,當驗證中出現錯誤或成功時(如果可能的話)...我嘗試使用FacesMessage.SEVERITY_INFO獲取成功消息,但仍然顯示消息爲錯誤.. –

+0

不要將它作爲'ValidatorException'丟棄。直接將其添加到上下文中。例如。 'context.addMessage(component.getClientId(context),message)'。 – BalusC

相關問題