【问题标题】:primefaces dropdown with enums as table filter returning Value is not vallid使用枚举作为表过滤器返回值的 primefaces 下拉列表无效
【发布时间】:2015-10-14 20:41:44
【问题描述】:

我有两个下拉列表作为 JSF primefaces p:dataTable 中的表/列过滤器,它们由 ENUMS 填充,当我从第一个中选择值然后我得到验证错误

    form:billingTable:methodDropdown: Validation Error: Value is not validform:billingTable:methodDropdown: Validation Error: Value is not valid

我认为问题出在第二个下拉菜单中的空选择,但我没有找到解决方法。

两个枚举都作为 List 而不是作为 EnumType[] 返回

表格显示为 LazyDataModel

我正在使用omnifaces GenericEnumConverter

代码:

1.) 第一个下拉菜单

@Named
public class PaymentMethodsForDropDown {

    private ArrayList<PaymentMethod> paymentMethods;

    @Produces
    @Named(value = "paymentMethods")
    @ViewScoped
    public ArrayList<PaymentMethod> getPaymentMethods() {
        if (paymentMethods == null) {
            paymentMethods = new ArrayList<>();
            for (PaymentMethod pm : PaymentMethod.values()) {
                paymentMethods.add(pm);
            }
        }
        return paymentMethods;
    }

}

XHTML

<p:column id="methodColumn" headerText="Method of payment" filterBy="#{bill.method}" sortBy="#{bill.method}"  > 
                        <f:facet  name="filter">
                            <h:selectOneMenu  id="methodDropdown" onchange="PF('billingTable').filter()"  value="#{lazyBillingModel.paymentMethod}" style="width:130px;" converter="omnifaces.GenericEnumConverter" >
                                 <f:selectItem itemLabel="Select One" itemValue="#{null}" noSelectionOption="true" />
                                <f:selectItems value="#{paymentMethods}" var="var" itemValue="#{var}" itemLabel="#{var.name}" />   
                            </h:selectOneMenu>
                        </f:facet>
                        <h:outputText value="#{bill.method.name}" />
                    </p:column>

2.) 第二个下拉菜单

@Named
public class PaymentStatusDropDown {

    private ArrayList<PaymentStatus> paymentStatuses;

    @Produces
    @Named(value = "paymentStatuses")
    @ViewScoped
    public ArrayList<PaymentStatus> getPaymentStatus() {
        if (paymentStatuses == null) {
            paymentStatuses = new ArrayList<>();
            for (PaymentStatus ps : PaymentStatus.values()) {
                paymentStatuses.add(ps);
            }
        }
        return paymentStatuses;
    }

}


 <p:column  id="statusColumn"  headerText="Status of payment" filterBy="#{bill.status}" sortBy="#{bill.status}">
                        <f:facet name="filter"> 
                            <h:selectOneMenu  id="statusDropdown" onchange="PF('billingTable').filter()" style="width:100px;"  value="#{lazyBillingModel.paymentStatus}" converter="omnifaces.GenericEnumConverter" >
                                <f:selectItem itemLabel="Select One" itemValue="#{null}" noSelectionOption="true" />
                                <f:selectItems value="#{paymentStatuses}" var="item" itemValue="#{item}"  itemLabel="#{item.name}" /> 
                            </h:selectOneMenu>
                        </f:facet>
                        <h:outputText value="#{bill.status.name}" />
                    </p:column> 

【问题讨论】:

    标签: jsf jsf-2 drop-down-menu primefaces enums


    【解决方案1】:

    您应该在 PaymentMethodsForDropDownPaymentStatusDropDown 中返回 List 而不是 ArrayList。

    @Named
    public class PaymentStatusDropDown {
    
          private List<PaymentStatus> paymentStatuses;
    
          @Produces
          @Named(value = "paymentStatuses")
          @ViewScoped
          public List<PaymentStatus> getPaymentStatus() {
              if (paymentStatuses == null) {
                  paymentStatuses = new ArrayList<>();
                  for (PaymentStatus ps : PaymentStatus.values()) {
                      paymentStatuses.add(ps);
                  }
               }
              return paymentStatuses;
              }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      相关资源
      最近更新 更多