2014-01-16 39 views
1

我有一個表格是這樣的:條件時FacesConverter涉及

<h:form> 
    Phone number: 
      <h:inputText id="phone_number" 
         value="#{dbUserManager.phoneNumber}" 
         validatorMessage="The phone number is invalid." 
         required="#{auth.value eq 'MOBILE'}" 
         requiredMessage="Phone number is required." /> 
      </h:inputText> 
    Authentication type: 
      <h:selectOneMenu value="#{dbUserManager.authentication}" converter="#{authenticationTypeConverter}" binding="#{auth}"> 
       <f:selectItems value="#{dbUserManager.authTypeList}" /> 
      </h:selectOneMenu> 
</h:form> 

AuthenticationType類似於此的實體:

@Entity 
public class AuthenticationType implements Serializable 
{ 
    @Id 
    @Basic(optional = false) 
    private Short id; 
    @Basic(optional = false) 
    private String description; 
    @Override 

    //... 

    public String toString() 
    { 
    return description; 
    } 

最後AuthenticationTypeConverter:

@Stateless 
@ManagedBean 
@FacesConverter(value="authenticationTypesConverter") 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class AuthenticationTypeConverter implements Converter 
{ 
    @PersistenceContext(unitName="pu") 
    private EntityManager em = null; 

    @Override 
    public Object getAsObject(FacesContext fc, UIComponent uic, String string) 
    { 
     TypedQuery<AuthenticationType> q = em.createNamedQuery(
       AuthenticationType.FIND_BY_DESCRIPTION, 
       AuthenticationType.class); 
     q.setParameter("description", string); 
     return q.getSingleResult(); 
    } 

    @Override 
    public String getAsString(FacesContext fc, UIComponent uic, Object o) 
    { 
     if (o == null) 
     { 
      return ""; 
     } 
     return o.toString(); 
    } 
} 

我試圖做的是將認證類型設置爲時將電話號碼的必填項設置爲true 「移動」。但它不像我預期的那樣。

我認爲問題在於我需要使用FacesConverter進行AuthenticationType。但我不知道如何解決它。

任何人都可以提示嗎?

感謝

回答

1

你必須重新呈現在h:inputText -field用戶從您的h:selectOneMenu選擇之後。要做到這一點,改變此選擇

<h:selectOneMenu value="#{dbUserManager.authentication}" 
    converter="#{authenticationTypeConverter}" binding="#{auth}"> 
    <f:selectItems value="#{dbUserManager.authTypeList}" /> 
    <f:ajax event="change" render="phone_number" /> 
</h:selectOneMenu> 

另外在inputTexts required -attribute我希望更多的東西一樣

{dbUserManager.authentication.description} 

試試看......

更新2014/01/22:

如果要在phone_number字段中保存已輸入的信息,則可以告訴<f:ajax>標記不僅執行selectOneMenu而且執行新的輸入字段。在這種情況下,更換上面的<f:ajax />解決方案與

... 
    <f:ajax event="change" execute="@this phone_number" render="phone_number" /> 
... 
+0

感謝您的快速回復。我這樣做了,我得到了這個錯誤:event =「itemSelect」事件它不是爲這個組件定義的有效事件名稱 –

+0

對不起,將它與另一個選擇組件混合。現在應答已更正。 –

+0

謝謝。現在它工作。 –