2012-05-15 2 views
2

Jsf 2.0 및 Primefaces 3.2를 사용하여 webapp를 구현 중입니다. 나는이 예상치 못한 behavoiur를 발견했습니다 : 나는 selectOneMenucommandButton을 가지고Primefaces selectOneMenu 리스너가 String이 아닌 다른 객체와 함께 호출되지 않음

<p:selectOneMenu id="selsel" value="#{bean.myObj}"> 
    <f:selectItems value="#{bean.myObjList}" /> 
</p:selectOneMenu> 
<p:commandButton id="btnid" value="Ok" actionListener="#{bean.updateSelectValues()}" /> 

아래로 무엇 발생하는 myObj가 아닌 경우 String가의 updateSelectValues 메서드가 호출되지 않는 것입니다. 어떤 예외 나 오류도 전혀 볼 수 없으며 단지 호출되지 않았습니다. myObj로에 대한

private List<MyObj> myObjList; 
private MyObj myObj; 
// getters and setters 

public void updateSelectValues() { 
    System.out.println(this.myObj); 
} 

코드 :

public class MyObj implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private String param1; 
    private int param2; 

    @Override 
    public String toString() { 
    StringBuilder builder = new StringBuilder(); 
    builder.append("MyObj [param1="); 
    builder.append(this.param1); 
    builder.append(", param2="); 
    builder.append(this.param2); 
    builder.append("]"); 
    return builder.toString(); 
    } 

} 

답변

8

HTML과 HTTP는 자바 객체를 이해하지 못하기 때문입니다 여기에 백업 콩입니다. JSF가 HTML을 생성 할 때 모든 Java 객체는 String으로 변환됩니다. String 인 모든 HTTP 요청 매개 변수는 제출 된 양식 데이터가 JSF에 의해 처리 될 때 Java 오브젝트로 다시 변환되어야합니다.

구체적인 문제에 대해서는 <h:message>, <h:messages> 또는 양식과 동일한 PrimeFaces (또한 ajax 제출시 업데이트 됨)가있는 경우 "null 변환기"에 대한 변환 오류가 있어야합니다. 또한 서버 로그에주의를 기울인 경우 처리되지 않은 메시지에 대한 경고도 표시되어야합니다.

MyObj과 그 고유 한 String 표현 사이를 변환하는 사용자 지정 Converter을 만들어야합니다. 예 :

@FacesConverter(forClass=MyObj.class) 
public class MyObjConverter implements Converter { 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object valueToRender) { 
     // Convert MyObj to its unique String representation. 
    } 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) { 
     // Convert String to MyObj. 
    } 

} 

일반적으로 이러한 개체는 이미 ID로 데이터베이스 또는 매핑에 저장되어 있습니다. 그런 다음 해당 ID를 고유 한 String 표현으로 정확하게 사용합니다.

관련 문제