primefaces p : autoComplete 구성 요소가 포함 된 JSF 양식을 작성 중입니다. 다음은 autoComplete 구성 요소에 대한 관련 정보를 표시하는 내 xhtml 페이지의 압축을 푼 것입니다. Primefaces p : POJO의 String 필드에 대한 자동 완성 문제
<p:autoComplete
value="#{curAttribute.value}"
completeMethod="#{newBacking.lookupActivated}"
var="curEntry"
itemLabel="#{curEntry.classname}"
itemValue="#{curEntry.id}"
emptyMessage="Start typing..."/>
는
curAttribute
는
CosmoAttribute
클래스의 인스턴스주의하십시오, 그리고
CosmoAttribute.value
하는 문자열 (물론,
CosmoAttribute
이 필드에 대한 모든 getter 및 setter를 가지고)입니다.
newBacking.lookupActivated()
메서드는 List<CosmoCard>
을 반환합니다.
CosmoCard.classname
및 CosmoCard.id
은 모두 문자열입니다.
나는 POJOs로 woirking하고 있지만, 모든 값은 POJO의 String 필드이므로, 나는 변환기가 필요하다고 생각하지 않는다. 어쨌든, 내 자동 완성 필드는 잘 작동하지만 내가 항목을 선택하면, 다음과 같은 예외가 :
SEVERE: Error Rendering View[/test.xhtml]
javax.el.PropertyNotFoundException: /test.xhtml @98,68 itemLabel="#{curEntry.id}": The class 'java.lang.String' does not have the property 'id'.
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:111)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at org.primefaces.component.autocomplete.AutoComplete.getItemLabel(AutoComplete.java:148)
.
.
Caused by: javax.el.PropertyNotFoundException: The class 'java.lang.String' does not have the property 'id'.
at javax.el.BeanELResolver.getBeanProperty(BeanELResolver.java:730)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:351)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
.
.
사람 내가 잘못 뭐하는 거지의 단서습니까? very similar question here을 찾을 수는 있지만 불행히도 답이 없습니다. 나는 내 코드에 대해 더 자세히 설명하고자한다.
UPDATE : 사실
, 모든 것이 잘 작동 : 자동 완성 : 나는 페이지의 드롭 다운에서 올바른 값을 참조하십시오. 내가 값을 선택하면, backing 빈 (newBacking)의 데이터가 그에 따라 업데이트됩니다. 그러나 예외를 제거 할 수는 없지만 내 페이지 실행에 영향을 미치지는 않습니다.
태그의 제약 조건을 존중합니다. 즉 value 속성과 itemValue는 동일한 유형 (두 문자열)입니다. 제대로되지 않은 유일한 점은 시스템이 목록의 목록을 변환하려고 시도하는 것입니다. 이유 또는 시점을 모르지만 변환의 실패 (및 후속 예외)가 해당 목록에 영향을 미치지 않습니다. 내 페이지의 동작.
UPDATE : 여기서
는 very simplified version of the project (넷빈즈)에 연결된다. 프로젝트의 관련 파일도 아래에 나열되어 있습니다.
test.xhtml
<h:body>
<h:form id="form">
<p:dataTable var="curAttribute" value="#{newBacking.card.attributes}">
<p:column >
THE CURSED FIELD <br /><br />
<p:autoComplete
value="#{curAttribute.value}"
completeMethod="#{newBacking.lookupActivated}"
var="curEntry"
itemLabel="#{curEntry.code}"
itemValue="#{curEntry.id}">
</p:autoComplete>
</p:column>
</p:dataTable>
</h:form>
newBacking.java
@Named()
@SessionScoped
public class NewBacking implements Serializable {
private CosmoCard card;
private String currentCardClassname = "";
@PostConstruct
public void init() {
Random randomGenerator = new Random();
card = new CosmoCard();
card.setId("ID" + randomGenerator.nextInt(1000));
CosmoAttribute myLA = new CosmoAttribute();
myLA.setLabel("LookupAttributeLabel");
myLA.setValue("LookupAttributeValue");
card.getAttributes().add(myLA);
}
public CosmoCard getCard() {
return card;
}
public String getCurrentCardClassname() {
return currentCardClassname;
}
public void setCurrentCardClassname(String currentCardClassname) {
this.currentCardClassname = currentCardClassname;
}
public List<CosmoCard> lookupActivated(String tgtQuery) {
Logger.getLogger(NewBacking.class.getName()).info("[NewBacking.lookupActivated()] Query: " + tgtQuery);
return CosmoCardList.generateCardList(10).getCards();
}
}
)는 p : autocomplete 태그의 값으로 간주되며, 완료 메소드 (CosmoCard)가 리턴하는 것과 같은 유형은 아닙니다.2) 변환기를 사용하지 않으면 complete 메서드가 List을 반환합니다. 3) 변환기를 사용하더라도 시스템은 CosmoAttribute 대신 CosmoCard를 배치하여 값을 할당하려고합니다. 나는 완전한 메소드의 리턴 타입으로리스트 을 사용할 것이라고 생각하기 시작했다. 라벨과 값을 구분하는 구분 기호가있을 수 있습니다. –
INElutTabile
제 생각에는 당신이 분명히 당신이 사용하는 것을 반환해야합니다. 따라서 문제는 2와 3을 일으키는 첫 번째 추론 때문입니다. 분리자를 사용하고 반환 된 문자열을 처리하는 것과 같은 작업은 좋은 습관이 아닙니다. – Pumpkin
내 생각을 정확히 (분리 물에 관한 것). 그렇다면 p : autocomplete와 complete 메소드의 반환 유형 모두에서 동일한 유형의 POJO를 사용해야하는 것 같습니다. 맞습니까? 그래서 나는 변환기를 사용하는 데 아무런 문제가 없다. 나는 다른 해결책을 보지 못했다. – INElutTabile