JSF

2012-12-13 7 views
2

에 selectManyListbox에 목록을 상황 값을 바인딩하는 방법 : 나는 자바 서버 페이지와 두 ArrayList<Integer> 속성이있는 세션 범위 관리 빈 얼굴이 있습니다 유지를 위해 가능한 값의 목록을 유지 하나를하고 다른 선택된 값의리스트 JSF 페이지에는이 두 속성이 바인딩 된 <h:selectManyListBox> 구성 요소가 있습니다. JSF

문제 : : 양식을 제출 한 후 선택한 값이 문자열로 변환됩니다 (ArrayList 유형의 속성은 실제로 두 개의 문자열을 보유합니다). 내가 변환기를 사용하는 경우 그러나, 나는이 같은 오류 메시지가 :

Validation Error: Value is not valid

질문 : 어떻게 제대로 <h:selectManyListBox> 구성 요소에 ArrayList<Integer> 속성을 바인딩 할 수 있습니다?

저를 도와 주셔서 감사합니다.

구체적인 코드

은 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> 

그리고 관리 빈 :

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은 제네릭 유형이임을 확인할 수 없습니다.으로 설정하고 기본 값은 String으로 가정합니다 (적용 요청 값 적용 단계에서 기본 HttpServletRequest#getParameter() 호출의 기본 유형이므로).

: 단지 유형이 정보를 명확하게 런타임 중에 알려져 대신 Integer[]를 사용하는

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

또는 :

당신은 당신이 JSF가 IntegerConverter를 내장 사용하여 명시 적으로 Converter을 지정하거나필요

private Integer[] selection; 
+0

고마워요! 코드가 추가 된 IntegerConverter와 제대로 작동합니다. 나는 지금까지 [타입 소거] (http://docs.oracle.com/javase/tutorial/java/generics/erasure.html)에 대해 몰랐습니다 ... –

+0

당신은 천만에요. – BalusC

+0

@ BalusC, 감사합니다, 이것은 실제로 내 질문 [여기] (http://stackoverflow.com/q/14048382/516433)에 대한 답변으로 밝혀졌습니다. 이것은 이상한 방법으로 선물로 알아낼 고통스러운 하나가 될 수 있습니다. 그러나, 나는 더 잘 알고 있어야합니다 ... – Lucas