代码之家  ›  专栏  ›  技术社区  ›  Jens B

p的PropertyNotFoundException:列filterValue属性

  •  1
  • Jens B  · 技术社区  · 6 年前

    我们正在尝试将应用程序从tomcat/websphere迁移到was liberty profile。 此外,我们正在将myfaces版本(使用2.1)升级到myfaces-2.2。

    为了保存表的当前状态(过滤),我们将过滤后的值存储在映射中,并在加载表时读取它(p:column的filterValue属性)。

    当最初加载表时,将使用正确的方法(在我们的示例中是数据模型中的getFilterValue)。但是,如果我们开始筛选列,将无法再找到该方法,并且会发生以下异常:

    javax.el.PropertyNotFoundException: Die Eigenschaft 'getFilterValue' wurde nicht im Typ package.LazyModel gefunden.
    javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:245)
    javax.el.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:222)
    javax.el.BeanELResolver.property(BeanELResolver.java:332)
    javax.el.BeanELResolver.getType(BeanELResolver.java:83)
    javax.el.CompositeELResolver.getType(CompositeELResolver.java:99)
    org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getType(FacesCompositeELResolver.java:150)
    org.apache.el.parser.AstValue.setValue(AstValue.java:199)
    org.apache.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:257)
    org.jboss.weld.el.WeldValueExpression.setValue(WeldValueExpression.java:64)
    org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.setValue(ContextAwareTagValueExpression.java:153)
    org.primefaces.component.datatable.DataTable.processUpdates(DataTable.java:746)
    org.apache.myfaces.context.servlet.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:787)
    org.apache.myfaces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:213)
    org.primefaces.component.api.UIData.visitTree(UIData.java:822)
    

    表格:

    <p:dataTable id="table" var="group"
                    value="#{bean.lazyModel}"
                    selection="#{bean.selectedMulti}"
                    rows="#{bean.lazyModel.rows}" paginator="true"
                    currentPageReportTemplate="#{msg['data.table.pagereport']}"
                    paginatorTemplate="#{msg['data.table.paginator']}"
                    rowsPerPageTemplate="#{msg['data.table.rows']}"
                    resizableColumns="true" rowKey="#{group.pkId}" lazy="true"
                    filterDelay="1000" emptyMessage="#{msg['data.table.empty']}"
                    style="font-size: 8pt;"
                    tableStyle="font-size: 8pt; table-layout:auto;"
                    first="#{bean.lazyModel.first_m}"> >
    
                    <p:column headerText="Name"
                        sortBy="#{group.name}" filterBy="#{group.name}"
                        filterValue="#{bean.lazyModel.getFilterValue('name')}"
                        filterStyleClass="column_filter" styleClass="wrap">
                        <h:outputText value="#{group.name}" />
                    </p:column>
    
                    ...
    

    lazymodel:

    @Named
    @Scope(value = "prototype")
    public class LazyModel extends AbstractLazyModel<Brand> {
    
      private static final long serialVersionUID = 2247660292777600670L;
    
      /**
       * Konstruktor
       */
      public LazyModel() {
        super();
      }
    
     public Object getFilterValue(final String keyForColumn) {
        return this.filterManager.getFilterField(this.getKeyForPage(), keyForColumn);
    
      }
    

    我认为这应该是最重要的事情。

    所以,我不明白这些版本之间发生了什么变化,导致了异常。

    一切帮助都会很好。TIA!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Jasper de Vries nndru    6 年前

    我不知道为什么以前会这样(它不应该(正确地))工作,但您当前遇到的错误是意料之中的。这个 filterValue 属性应绑定到具有读写访问权限的属性。您可以将每个列筛选器值绑定到单个属性,但使用 Map<String,Object> 用于筛选值。

    Bean(在您的情况下是懒惰模型):

    private Map<String,Object> filterValues = new HashMap<>();
    // ... add getter and setter for filterValues
    

    XHTML:

    filterValue="#{bean.lazyModel.filterValues['name']}"