2

我的 selectManyCheckbox 标签有问题..

我们在 JBoss Portal 中使用 JSF 1.1(我认为它的版本是 4.2,但不确定)..

我有以下 JSF 标记:

<h:selectManyCheckbox layout="lineDirection" 
   value="#{personBean.selectedPersonsLongArray}"
   id="selectedPersons">
   <f:selectItems value="#{personBean.persons}" />
</h:selectManyCheckbox>

(当然我有一个提交表单的按钮)。我的豆子看起来像这样:

    public class PersonBean {
        private List<SelectItem> persons;

        private List<SelectItem> selectedPersons = new ArrayList<SelectItem>(); // +getter +setter
        private List<String> selectedPersonsStringList = new ArrayList<String>();// +getter +setter
        private List<Long> selectedPersonsStringList = new ArrayList<Long>();// +getter +setter
        private long[] selectedPersonsLongArray = new long[0];// +getter +setter
        private String[] selectedPersonsStringArray = new String[0]; // +getter +setter

        public void getPersons(){
            if(persons == null){
                List<Person> personsFromDb = // get from DB
                persons = new ArrayList<Person>(personsFromDb.size());
                for(Person person : personsFromDb){
                    // ID of a person is a long
                    persons.add(new SelectItem(person.getId(), person.getName()));
                }
            }
            return persons;
        }

        public void setPersons(List<SelectItem> persons){
            this.persons = persons;
        }

        ...
    }

bean 是会话范围的,并且 Person 的 Id 属性是类型long。我尝试将标签的值绑定到 bean 中列出的所有类型。提交时,几乎都会selectedPersonLongArray给出“验证错误”消息。如果我将它绑定到selectedPersonLongArray我得到一个错误,说selectedPersons必须填写。

正如我所说,bean 是会话范围的,我已经仔细检查过persons请求之间的列表没有变化,这似乎是这个标签的一个常见问题。

有任何想法吗?

4

1 回答 1

3

泛型类型信息在运行时丢失。所有 JSF/EL(实际上是反射)看到的是 a List,而不是 a List<Long>。默认类型是String因为它只是标准的返回类型request.getParameter()。这永远不会trueequals()检查Long可用项目列表中的任何值时返回。这解释了“验证错误:值无效”错误。

您需要一个固定的类型属性,例如,long[]以便Long[]JSF/EL 能够通过反射确定正确的类型。

如果您真的需要它是List<Long>由于设计限制,那么您应该明确指定一个转换器。否则 JSF 只会用未转换String的对象填充它,这最终只会导致ClassCastException业务代码开始对其进行迭代。

您可以为此使用 JSF 内置javax.faces.Long转换器。

<h:selectManyCheckbox ... converter="javax.faces.Long">

更新:根据评论,long[]很可能导致转换错误,而Long[]工作。这很可能是 JSF 1.1 特定的错误。那就坚持吧Long[]

于 2012-10-30T11:34:33.047 回答