JSF 1.1 : selectManyCheckbox not submitting properly

标签 jsf jakarta-ee selectmanycheckbox

我的 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 属于 session 范围,Person 的 Id 属性的类型为 long。我尝试将标签的值绑定(bind)到 bean 中列出的所有类型。提交时,除了 selectedPersonLongArray 之外的所有内容都会给出“验证错误”消息。如果我将其绑定(bind)到 selectedPersonLongArray,我会收到一条错误消息,提示必须填写 selectedPersons

正如我所说,bean 是 session 范围的,并且我已经仔细检查过 persons 列表在请求之间不会更改,这似乎是此标记的常见问题。

有什么想法吗?

最佳答案

通用类型信息在运行时丢失。所有 JSF/EL(实际上是反射)看到的是 List ,不是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[]那么。

关于JSF 1.1 : selectManyCheckbox not submitting properly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13137446/

相关文章:

JSF2 或 primefaces p :selectManyCheckbox styling with icons

CSS #{resource} 版本控制

java - h :dataTable binding => duplicate ID

jsf - jsf 中的异常处理 - 在新页面中打印错误消息

java - 带有重音符号的编码错误。峰会形成时的 Spring-Mvc

jsf - List<T> 上的 UISelectMany 导致 java.lang.ClassCastException : java. lang.String 无法转换为 T

jsf - fileUpload 不会在带有 JSF 2.2 的 PrimeFaces 3.5 中触发事件

java - 无法将类型编码为元素,因为它缺少自动生成的类的 @XmlRootElement 注释

java - 使用公开为 @WebService 的基于 SOAP 的 @Stateless EJB 实现长轮询

jsf - 将 SelectManyCheckbox 与对象列表一起使用