Я читал на SO некоторые QA об одном и том же компоненте, но чувствую, что что-то упустил, потому что я на шаг позади
Я даже не могу открыть страницу при использовании компонента автозаполнения простых лиц.
Фрагмент для этого:
<p:autoComplete value="#{indirizzoCtrl.selectedCodiceNazione}"
completeMethod="#{indirizzoCtrl.completeNazione}"
var="nazione" itemLabel="#{nazione.nome}"
itemValue="#{nazione.codiceNazione}" />
Nazione - это класс Pojo, в котором CodiceNazione
и Nome are
два строковых поля (наверняка, с getter и setter). 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" />
Но все еще не работает. Конвертер даже не вызывается: я зарегистрировал его в своем файлеface-config.xml.
Я также попробовал itemValue = "# {nazione}", как в демонстрации простых лиц, но проблема стала атрибутом ItemLabel
, сопоставленным с nazione.nome
.
Что я делаю не так?