【发布时间】:2012-01-23 12:13:00
【问题描述】:
我在 SO 上阅读了一些关于同一组件的 QA,但我觉得我遗漏了一些东西,因为我落后了一步。 在其中使用 primefaces 自动完成组件时,我什至无法打开页面。 它的sn-p是:
<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 的解释 here,在我看来,我不需要涉及任何转换器,因为 itemValue 和 value 属性都映射到字符串属性。
无论如何,当我打开包含此自动完成 sn-p 的页面时,它会因以下错误而崩溃:
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 文件中注册了它。
我还尝试了在 primefaces 展示中的 itemValue="#{nazione}" 但问题变成了ItemLabel 属性,映射到nazione.nome。
我做错了什么?
【问题讨论】:
-
什么 PF 版本?其他 PF 组件在同一视图中是否正常工作?
-
@BalusC:2.2 版,其他一切正常
-
添加转换器后的错误信息是什么?
-
@gurung:完全一样。如果我写
itemValue="#{nazione.codiceNazione}",那么错误信息是完全一样的。如果我将其更改为itemValue="#{nazione}",则会引发完全相同的错误,但引用itemLabel="#{nazione.nome}"。实际上,它无法将属性从nazione对象中拉出。 -
@themarcuz 有人发现这个问题吗?我有完全一样的问题。我一直在研究这个问题,我认为我们不需要转换器,因为 autoComplete 的 value 字段是一个字符串,而不是 POJO。非常感谢您的回答!
标签: jsf-2 autocomplete primefaces pojo