0

我有一个包含一个<h:selectManyMenu>元素的 JSF 页面。value 属性指向在子类中定义为 type 的通用对象ArrayList<String>。根据java文档,UISelectMany应该从转换中返回它的值作为Collection这个具体类型。但它作为String[]数组返回。我错过了什么?

<h:selectManyMenu value="#{parameter.value}">
    <f:selectItems value="#{parameter.valueList}"/>
</h:selectManyMenu>
public class Parameter<ArrayList<String>> extends ParentClass
{
  private LinkedHashMap<Object, String> valueList;

  public List<SelectItem> getValueList()
  {
    ArrayList<SelectItem> list = new ArrayList<SelectItem>();
    for (Iterator<Object> i = this.valueList.keySet().iterator(); i.hasNext();)
    {
      Object value = i.next();
      list.add(new SelectItem(value, this.valueList.get(value)));
    }

    return list;
  }
}
public abstract class ParentClass<T>
{
  private T value;

  public T getValue() { return this.value; }
  public void setValue(T t) { this.value = t; }
}
4

2 回答 2

1

这是因为它getValue()返回一个参数化类型T,在泛型类型擦除之后将变为Object. 换句话说,EL 没有看到它实际上返回了 a Listbut Object,因此将默认为String[].

您需要collectionType在选择组件上显式指定属性,并将所需集合实现的 FQN 作为值。

<h:selectManyMenu ... collectionType="java.util.ArrayList">

与具体问题无关<f:selectItems>,也支持Map<K, V>. 只需LinkedHashMap将其直接喂给它,而无需将其按摩到List<SelectItem>. 映射键成为选项值,映射值已经成为选项标签。另请参阅我们的selectOneMenuwiki 页面

于 2015-07-07T05:35:02.143 回答
0

我无法让 JSF 从子类中读取属性的类型定义。指定collectionType属性不起作用,即使尝试通过@Override在子类中创建方法,发送到我的 bean 的支持值仍然是一个String[]数组。我能够让 JSF servlet 将此值作为 an 返回的唯一方法是ArrayList<String>在子类中创建一对额外的 get/set 属性方法,并将其ArrayList<String>作为返回和参数类型。

public class Parameter extends ParentClass<ArrayList<String>>
{
  public ArrayList<String> getManyValue() { return super.getValue(); }
  public void setManyValue(ArrayList<String> value) { super.setValue(value); }
}


public abstract class ParentClass<T>
{
  protected T value;
  public T getValue() { return this.value; }
  public void setValue(T value) { this.value = value; }
}


<h:selectManyMenu value="#{parameter.manyValue}"/>
于 2015-07-08T20:48:00.110 回答