2013-04-17 2 views
3

내가 사용 selectonemenu과 같이 유효하지 않습니다selectonemenu 검증 오류 : 값

<h:selectOneMenu value="#{MyBean.zajecie.przedmiot}"> 
    <f:selectItems value="#{MyBean.przedmioty}" var="p" 
     itemLabel="#{p.nazwa}" itemValue="#{p}" /> 
    <f:converter converterId="converter.PrzedmiotConverter" /> 
</h:selectOneMenu> 

에서 myBean :

private Zajecie zajecie;//+set get 
private List<Przedmiot> przedmioty;//+set get 

@PostConstruct 
private void init() { 
    przedmioty = przedmiotDao.findByLogin("login"); 
    zajecie = new Zajecie(); 
} 

및 컨버터 방법 :

public Object getAsObject(FacesContext context, UIComponent component, String value) { 
    PrzedmiotDao przedmiotDao = DaoFactory.getInstance().getPrzedmiotDao(); 
    Przedmiot przedmiot = przedmiotDao.findById(Przedmiot.class, Integer.parseInt(value)); 
    return przedmiot; 
} 

public String getAsString(FacesContext context, UIComponent component, Object value) { 
    Przedmiot przedmiot = (Przedmiot) value; 
    String idAsString = String.valueOf(przedmiot.getPrzedmiotId()); 
    return idAsString; 
} 

selectonemenu 구성 요소 그것이 예정되어있는대로 사람이 거주하고 있습니다. 제출하면 Validation Error: Value is not valid이 표시됩니다. 나는 id 필드를 사용하여 이클립스로 생성 했으므로 엔티티에 적절한 equals() 메서드가 필요하다는 것을 알고있다. 그런 다음 이 다음과 같이 반환 했으므로 getClass() != obj.getClass()obj instanceof Przedmiot으로 변경해야했습니다. Przedmiot_$$_javassist_1. 결국 objnull 인 것으로 판명되어 관련성이 있는지 확신 할 수 없습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

편집 :

에서 myBean은 ViewScoped입니다.

재미있는 점은 동일한 변환기를 사용하는 유사한 코드가 응용 프로그램의 다른 부분에서 작동한다는 것입니다. 차이점은 작업 부분에서 나는 단지 Przedmiot 유형 목록을보고 있고 다른 방식으로 그것을 얻고 있다는 것입니다.

@PostConstruct 
private void init() { 
    student = studentDao.findByLogin(ra.getUser()); 
} 

<h:selectOneMenu value="#{otherBean.przedmiot}"> 
    <f:selectItems value="#{otherBean.student.grupa.przedmiots}" var="p" 
     itemLabel="#{p.nazwa}" itemValue="#{p}" /> 
    <f:converter converterId="converter.PrzedmiotConverter" /> 
</h:selectOneMenu> 

답변

1
당신의 계산기에서

: Integer.parseInt(value), 그리고 <f:selectItems에 당신은 itemValue="#{p}"을 설정, 각각의 #{p}Przedmiot 유형의 인스턴스입니다.

은 참조 : Why selectOneMenu Send ItemLabel to the converter?

+0

그게 작동하지 않습니다. String을 Przedmiot에 캐스트 할 수 없습니다. 당신이 준 링크에 설명 된대로 고유 한 ID를 나타 내기 위해 값을 쓰지 않습니까? – user2270884

+0

아, 죄송합니다. 페이지를로드하거나 서버에 제출할 때 오류가 발생합니까? 제출시 –

+0

. 유효성 검사가 실패합니다. – user2270884

4

그것을 해결. 그것은 물론 잘못 작성된 equals() 방법이었다. 우선 내 질문에 실수가있었습니다. obj은 null로 처리되지 않았지만 other.przedmiotId은 null로 처리되었습니다. 그 죄송합니다. 일식에 의해 생성되는 방법을 봐 :

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (!(obj instanceof Przedmiot))//changed this from (getClass() != obj.getClass()) 
     return false; 
    Przedmiot other = (Przedmiot) obj; 
    if (przedmiotId == null) { 
     if (other.przedmiotId != null) 
      return false; 
    } else if (!przedmiotId.equals(other.przedmiotId)) 
     return false; 
    return true; 
} 

문제는 other.przedmiotId입니다. getter를 사용하여 값을 얻을 때 other.getPrzedmiotId()은 더 이상 null로 해석되지 않습니다.