【问题标题】:Conditional required in jsf 2 when FacesConverter involved当涉及 FacesConverter 时,jsf 2 中需要条件
【发布时间】:2014-01-16 15:31:02
【问题描述】:

我有这样的表格:

<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。但是不知道怎么解决。

谁能给个提示?

谢谢

【问题讨论】:

    标签: validation jsf-2


    【解决方案1】:

    在用户从您的h:selectOneMenu 中选择之后,您必须重新呈现h:inputText 字段。为此,请将此选择更改为

    <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 字段中保存已经输入的信息,您可以告诉&lt;f:ajax&gt; 标记不仅要执行selectOneMenu,还要在呈现新的输入字段之前执行它。在这种情况下,将上面的&lt;f:ajax /&gt; 解决方案替换为

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

    【讨论】:

    • 感谢您的快速回复。我这样做了,我得到了这个错误: event="itemSelect" event it is not a valid eventName defined for this component
    • 对不起,把它和另一个选择组件混在一起了。现在已更正答案。
    • 是否可以渲染a组件但保留值?
    • 尝试将 f:ajax 扩展为:&lt;f:ajax event="change" execute="@this phone_number" render="phone_number" /&gt; ... 另请参阅更新的答案。
    • 感谢它通过在身份验证类型上使用 ajax 解决了,例如
    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2020-03-08
    • 2019-08-12
    相关资源
    最近更新 更多