Я читал на SO некоторые QA об одном и том же компоненте, но чувствую, что что-то упускаю, потому что я на шаг позади. Я даже не могу открыть страницу при использовании в ней компонента автозаполнения простых лиц. Фрагмент для него:
<p:autoComplete value="#{indirizzoCtrl.selectedCodiceNazione}"
completeMethod="#{indirizzoCtrl.completeNazione}"
var="nazione" itemLabel="#{nazione.nome}"
itemValue="#{nazione.codiceNazione}" />
Nazione - это класс Pojo, где CodiceNazione
и Nome are
два поля String (обязательно с геттером и сеттером). completeNazione
— это метод ManagedBean, который возвращает List<Nazione>
. Глядя на объяснение BalusC здесь, мне кажется, что мне не нужен какой-либо преобразователь, потому что атрибуты itemValue и value сопоставляются со строковым свойством. В любом случае, когда я просто открываю страницу, содержащую этот фрагмент автозаполнения, он вылетает с этой ошибкой:
javax.el.PropertyNotFoundException: /Cliente/Indirizzo.xhtml @23,56 itemValue="#{nazione.codiceNazione}": itemValue="#{nazione.codiceNazione}": Property 'codiceNazione' not found on type java.lang.String
Почему это происходит? Я действительно не могу понять. Метод completeNazione еще даже не вызывался, поэтому он еще не должен знать никаких Nazione
. Что с этим не так?
Отредактировано: Следуя предложению, я попытался добавить конвертер, но по-прежнему получаю ту же ошибку. Вот мой преобразователь:
public class NazioneConverter implements Converter {
final static Logger log = Logger.getLogger(NazioneConverter.class);
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value.trim().equals("")) {
return null;
} else {
try {
IndirizzoRepository ir = new IndirizzoRepository();
List<Nazione> nazioni = ir.getNazioneByName(value);
if (nazioni.size()==1) return nazioni.get(0);
else throw new Exception();
} catch (Exception e) {
String msg = "Errore di conversione";
log.error(msg, e);
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, "Non è una nazione conosciuta"));
}
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null || value.equals("")) {
return "";
} else {
return String.valueOf(((Nazione) value).getNome());
}
}
}
теперь компонент в представлении выглядит так:
<p:autoComplete value="#{indirizzoCtrl.indirizzo.nazione.codiceNazione}"
completeMethod="#{indirizzoCtrl.completeNazione}"
var="nazione" itemLabel="#{nazione.nome}" converter="#{nazioneConverter}"
itemValue="#{nazione.codiceNazione}" forceSelection="true" />
Но все равно не работает. Конвертер даже не вызывается: я прописал его в свой файлfaces-config.xml. Я также попробовал itemValue="#{nazione}", как в примере с Primefaces, но проблема заключалась в атрибуте ItemLabel
, сопоставленном с nazione.nome
. Что я делаю неправильно?
itemValue="#{nazione.codiceNazione}"
, то сообщение об ошибке точно такое же. Если я изменю его наitemValue="#{nazione}"
, то будет выдана точно такая же ошибка, но со ссылкой наitemLabel="#{nazione.nome}"
. На практике он не может вытащить свойство из объектаnazione
. - person themarcuz   schedule 19.12.2011