2012-12-13 58 views
2

情況: 我有一個JavaServer Faces頁面,並有兩個ArrayList<Integer>性能會話範圍的託管bean:一個用於固定的可能值的列表,另一個用於舉行所選值的列表。在JSF頁面上有一個<h:selectManyListBox>組件,並綁定了這兩個屬性。如何<Integer>值綁定列表來selectManyListbox在JSF

問題:提交表單後,選定的值將被轉換爲字符串(ArrayList類型的屬性實際上包含幾個字符串!然而,當我使用一個轉換器,我得到這樣的錯誤消息:

Validation Error: Value is not valid

問題:我怎樣才能在ArrayList<Integer>屬性綁定到<h:selectManyListBox>成分是否正確?

謝謝你的好意幫助我。

具體代碼

JSF頁面:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core"> 
    <h:body> 
     <h:form> 
      <h:selectManyListbox value="#{testBean.selection}"> 
       <f:selectItems value="#{testBean.list}"></f:selectItems> 
      </h:selectManyListbox> 
      <h:commandButton action="#{testBean.go}" value="go" /> 
      <ui:repeat value="#{testBean.selection}" var="i"> 
       #{i}: #{i.getClass()} 
      </ui:repeat> 
     </h:form> 
    </h:body> 
</html> 

和管理bean:

import java.io.Serializable; 
import java.util.ArrayList; 

@javax.faces.bean.ManagedBean 
@javax.enterprise.context.SessionScoped 
public class TestBean implements Serializable 
{ 
    private ArrayList<Integer> selection; 
    private ArrayList<Integer> list; 

    public ArrayList<Integer> getList() 
    { 
     if(list == null || list.isEmpty()) 
     { 
      list = new ArrayList<Integer>(); 
      list.add(1); 
      list.add(2); 
      list.add(3); 
     } 
     return list; 
    } 

    public void setList(ArrayList<Integer> list) 
    { 
     this.list = list; 
    } 

    public ArrayList<Integer> getSelection() 
    { 
     return selection; 
    } 

    public void setSelection(ArrayList<Integer> selection) 
    { 
     this.selection = selection; 
    } 

    public String go() 
    { 
      // This throws an exception: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer 
      /*for (Integer i : selection) 
      { 
       System.out.println(i); 
      }*/ 
     return null; 
    } 
} 

回答

7

List<Integer>泛型類型信息在運行時會丟失,因此JSF /只看到List的EL無法識別通用類型是Integer並假定它是默認的String(因爲這是應用請求值階段中基礎HttpServletRequest#getParameter()調用的默認類型)。

您需要要麼明確指定一個Converter,你可以使用JSF內置IntegerConverter

<h:selectManyListbox ... converter="javax.faces.Integer"> 

只是使用Integer[]代替,其類型信息在運行時是清楚知道:

private Integer[] selection; 
+0

謝謝!該代碼與添加的IntegerConverter正常工作。我到目前爲止還不知道[type erasure](http://docs.oracle.com/javase/tutorial/java/generics/erasure.html)... –

+0

不客氣。 – BalusC

+0

@BalusC,謝謝,這實際上證明是我的問題的答案[這裏](http://stackoverflow.com/q/14048382/516433)。這可能是一個痛苦的人,因爲它以奇怪的方式呈現。不過,我應該只知道更好的... – Lucas

相關問題