Primefaces自动完成小部件获取错误:在类型java.lang.String上找不到属性“标签”

时间:2012-12-04 17:05:24

标签: jsf-2 autocomplete primefaces

我无法成功启用“p:autocomplete”小部件...

使用自动填充小部件,如此处所示......

<p:autoComplete id="abc"  dropdown="true" value="#{testBean.parmMap['inputval']}" completeMethod="#{testBean.testList}" var="items" itemLabel="#{items.label}" itemValue="#{items}" converter="#{itemConverter}" ></p:autoComplete>

我收到以下错误消息......

  

javax.el.PropertyNotFoundException:/index.xhtml @ 18,245 itemLabel =“#{items.label}”:在类型java.lang.String上找不到属性'label'

我无法解决此错误。不确定问题在哪里 - 我已经包含了下面显示的大部分相关代码。感谢您提供给我的任何指导!

以下是整个facelets页面 - index.xhtml ...

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:util="http://java.sun.com/jsf/composite/util"      
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      xmlns:p="http://primefaces.org/ui">      
    <f:view contentType="text/html">
        <h:head>
            <title>testprimeac</title>
            <meta charset="utf-8" />
        </h:head>
        <h:body>
            <h:form id="form1">
                <p:autoComplete id="abc"  dropdown="true" value="#{testBean.parmMap['inputval']}" completeMethod="#{testBean.testList}" var="items" itemLabel="#{items.label}" itemValue="#{items}" converter="#{itemConverter}" ></p:autoComplete>
            </h:form>
        </h:body>
    </f:view>
</html>`

这是“项目”类......

package aaa.bbb.ccc.war;

public class Item
{

    private String label;
    private String value;

    public String getLabel()
    {
        return label;
    }

    public void setLabel(String label)
    {
        this.label = label;
    }

    public String getValue()
    {
        return value;
    }

    public void setValue(String value)
    {
        this.value = value;
    }
}

public class Item { private String label; private String value; public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }

这是ItemConverter类......

package aaa.bbb.ccc.war;

import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

public class ItemConverter implements Converter
{

    @Override
    public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue)
    {
        if (submittedValue.trim().equals(""))
        {
            return null;
        }
        else
        {
            itemList = getItemList();

            try
            {
                for (Item item : itemList)
                {
                    if (item.getValue().equalsIgnoreCase(submittedValue))
                    {
                        return item;
                    }
                }

            }
            catch (Exception e)
            {
                throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid item object"));
            }
        }

        return null;
    }

    @Override
    public String getAsString(FacesContext facesContext, UIComponent component, Object value)
    {
        if (value == null || value.equals(""))
        {
            return "";
        }
        else
        {
            return String.valueOf(((Item) value).getValue());
        }
    }
    private static List<Item> itemList;

    private static List<Item> getItemList()
    {
        if (null == itemList)
        {
            refData = getRefData();
            itemList = refData.getTestList();
        }

        return itemList;
    }
    private static RefData refData;

    private static RefData getRefData()
    {
        refData = (RefData) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("refData");
        if (null == refData)
        {
            refData = new RefData();
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("refData", refData);
        }
        return refData;
    }
}

这是TestBean类...... import java.util.List; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.convert.ConverterException; public class ItemConverter implements Converter { @Override public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) { if (submittedValue.trim().equals("")) { return null; } else { itemList = getItemList(); try { for (Item item : itemList) { if (item.getValue().equalsIgnoreCase(submittedValue)) { return item; } } } catch (Exception e) { throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid item object")); } } return null; } @Override public String getAsString(FacesContext facesContext, UIComponent component, Object value) { if (value == null || value.equals("")) { return ""; } else { return String.valueOf(((Item) value).getValue()); } } private static List<Item> itemList; private static List<Item> getItemList() { if (null == itemList) { refData = getRefData(); itemList = refData.getTestList(); } return itemList; } private static RefData refData; private static RefData getRefData() { refData = (RefData) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("refData"); if (null == refData) { refData = new RefData(); FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("refData", refData); } return refData; } }

package aaa.bbb.ccc.war;

这是RefData类(在TestBean中引用)......

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.faces.context.FacesContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component("testBean")
@Scope("request")
public class TestBean implements Serializable
{

    private RefData refData;
    private LinkedHashMap<String, String> parmMap;

    public TestBean()
    {
    }

    public Map<String, String> getParmMap()
    {
        refData = getRefData();
        return refData.getParmMap();
    }

    public void setParmMap(LinkedHashMap<String, String> m)
    {
        refData = getRefData();
        refData.setParmMap(m);
        storeRefData(refData);
    }

    public void setTestList(List<Item> list) throws Exception
    {
        try
        {
            refData = getRefData();
            refData.setTestList(list);
            storeRefData(refData);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public List<Item> getTestList()
    {
        refData = getRefData();
        return refData.getTestList();
    }

    private static RefData getRefData()
    {
        RefData refData = (RefData) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("refData");
        if (null == refData)
        {
            refData = new RefData();
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("refData", refData);
        }
        return refData;
    }

    private static void storeRefData(RefData r)
    {
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("refData", r);
    }
}

import java.io.Serializable; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.faces.context.FacesContext; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("testBean") @Scope("request") public class TestBean implements Serializable { private RefData refData; private LinkedHashMap<String, String> parmMap; public TestBean() { } public Map<String, String> getParmMap() { refData = getRefData(); return refData.getParmMap(); } public void setParmMap(LinkedHashMap<String, String> m) { refData = getRefData(); refData.setParmMap(m); storeRefData(refData); } public void setTestList(List<Item> list) throws Exception { try { refData = getRefData(); refData.setTestList(list); storeRefData(refData); } catch (Exception e) { e.printStackTrace(); } } public List<Item> getTestList() { refData = getRefData(); return refData.getTestList(); } private static RefData getRefData() { RefData refData = (RefData) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("refData"); if (null == refData) { refData = new RefData(); FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("refData", refData); } return refData; } private static void storeRefData(RefData r) { FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("refData", r); } }

FWIW - 这是pom.xml(包括primefaces依赖)...


    package aaa.bbb.ccc.war;

1 个答案:

答案 0 :(得分:2)

+1表示您在第一段中所做的断言:这里有太多信息,因为您绑定到基本的String类型,所以转换器是不必要的。

我在这里看到的两个主要问题是

  1. 您选择不在值绑定中使用类型安全的集合。使用普通LinkedHashMap来保存字符串值很可能会导致问题,因为它们将被存储为对象,我不认为编译器有义务在这里为您做任何自动装箱。

  2. 您的支持completeMethod实现本质上是返回一个String个对象的存储。这是自动完成中var的变量。说明一点,你不能在那上面打电话getLabel()

  3. 您可以采用两种方式之一

    1. 将您的数据存储更改为类型安全的LinkedList字符串,丢失转换器,您应该没问题。您的var将是item itemLabelitemValue#{item}都是item

    2. 实现POJO以封装选择对象,保留转换器,然后您的后备数据存储变为POJO的简单列表,并且您的选择也成为POJO的实例而不是String

      < / LI>

      编辑:在您的澄清中,问题是由于自动完成下拉列表(类型value)返回的类型与自动完成的String绑定与支持bean的不一致( {{1}}类型)。下拉选择返回的类型必须与您在辅助bean中绑定的类型相同。