2013-04-24 3 views
1

정보selectOneMenu 후 선택한 항목

  • JSF 2.0
  • Primefaces으로 목록에서 항상 마지막 항목을 제출 보여줍니다 3.4
  • 두 개체는 사람

나는 간단한 드롭이 객체 양식 제출 (AJAX 호출)에서 선택을 제출하는 양식에 포함 된 아래로 이동 메뉴 :

<h:form> 

.... 

        <p:selectOneMenu converter="personconverter" 
         value="#{searchperson.viewPerson.relatedTo}" filter="true" 
         filterMatchMode="startsWith"> 
         <f:selectItems value="#{searchperson.people}" var="person" 
          itemLabel="#{person.fullName}" itemValue="#{person}" /> 
        </p:selectOneMenu> 
.... 
        <p:commandButton value="Save" 
         actionListener="#{searchperson.updatePerson}" /> 
</h:form> 

서버에 요청을 제출하면 selectOneMenu에 연결된 객체가 올바르게 전달되고 백엔드를이 변경으로 업데이트 할 수 있습니다. 페이지가 다시 렌더링 될 때

는 P의 값 : selectOneMenu은 :

(value="#{searchperson.viewPerson.relatedTo}") 

은 그냥 제출 된 새로운 변화를 렌더링하지 않습니다. People 목록의 마지막 Person 객체를 렌더링합니다.

변환기 :

@FacesConverter("personconverter") 
public class PersonConverter implements Converter { 

@Override 
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) { 

    People pApi = new People(); 
    Person per = new Person(); 

    try { 
     per = pApi.getPerson(Long.parseLong(value)); 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 
    return per; 
} 

@Override 
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) { 

    return String.valueOf(((Person) arg2).getId()); 
} 

}

Object 클래스

@Override 
public boolean equals(Object object) { 
    return true; //just to pass through temporarily 
} 

@Override 
public int hashCode() { 
    return 0; 
} 

얼굴-config.xml에

여기

은 다른 조각이다

<converter> 
    <converter-for-class>com.obj.Person</converter-for-class> 
    <converter-class>com.converter.PersonConverter</converter-class> 
</converter 

답변

2

equals()hashCode()의 구현이 심각하게 손상되었습니다. 이 방법 인스턴스가 Person 인 것으로 간주되므로 JSF는 사용 가능한 항목 목록을 기반으로 올바른 선택된 항목을 식별 할 수 없습니다. 최소한 contracts에 따라 구현해야합니다. 그것은 따라서, 고유 식별자를 나타내는 id 속성이 주어진

수정 :

@Override 
public boolean equals(Object other) { 
    return (id != null && other != null && getClass() == other.getClass()) 
     ? id.equals(((Person) other).id) 
     : (other == this); 
} 

@Override 
public int hashCode() { 
    return (id != null) 
     ? (getClass().hashCode() + id.hashCode()) 
     : super.hashCode(); 
} 
+0

아 - 감사합니다. 필자는 JSF에 비교적 익숙하지 않기 때문에이 두 메소드의 목적을 살펴 보았습니다. 그리고 내가 한 일을 왜 보았는지에 대한 당신의 설명은 완벽하게 이해됩니다. 매우 감사. – user2124871

+0

반갑습니다. JSF와 반드시 관련이있는 것은 아닙니다. 기본 Java의 기본 요소입니다. http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html – BalusC

+0

Extra PS - 블로그/항목이 내 학습에 큰 도움이되었습니다. – user2124871