我的 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()
的标准返回类型。这永远无法返回true
在equals()
上检查 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/