【问题标题】:JSF 1.1: selectManyCheckbox not submitting properlyJSF 1.1:selectManyCheckbox 未正确提交
【发布时间】:2012-10-19 16:49:42
【问题描述】:

我的 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>

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

    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 列表在请求之间没有变化,这似乎是这个标签的一个常见问题。

有什么想法吗?

【问题讨论】:

    标签: jsf jakarta-ee selectmanycheckbox


    【解决方案1】:

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

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

    如果由于设计限制你真的需要它是List&lt;Long&gt;,那么你应该明确指定一个转换器。否则 JSF 只会用未转换的 String 对象填充它,最终只会在业务代码开始迭代它时导致 ClassCastException

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

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

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

    【讨论】:

    • 按照您的建议,我已将 selectManyCheckbox 绑定到长数组属性,但这给了我一个错误,说需要 selectedPersons(我自己的翻译,因为我没有运行英语语言环境)。正如我在问题中所说,getPersons 列表在请求之间不会改变。
    • 然而,确切的错误信息(和语言环境)将不胜感激。此外,您确定在您为简洁起见从问题中省略的组件上没有其他验证器吗?例如。 required="true"
    • JSF 标记是逐字复制的(我只更改了 bean 的名称,因为它相当长)。错误消息是 da-DK 语言环境中的“selectedPersons skal udfyldes”。
    • 哦,那将是一个自定义的消息包文件。这个确切的消息 ({0} skal udfyldes) 是在哪个键上指定的?
    • 现在可以了。我似乎 JSF 对我使用 long[] 不满意...将类型更改为 Long[] 似乎可以使它工作。如果您可以更新您的答案以仅包含 Long[] ,这将非常适合将来参考:)
    猜你喜欢
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2011-11-15
    • 1970-01-01
    • 2012-06-18
    • 2019-08-31
    • 2017-12-21
    相关资源
    最近更新 更多