gpt4 book ai didi

jsf-2 - primefaces 使用 pojo 自动完成

转载 作者:行者123 更新时间:2023-12-01 11:31:01 26 4
gpt4 key购买 nike

我在 SO 上阅读了一些关于同一组件的 QA,但我觉得我遗漏了一些东西,因为我落后了一步。
在其中使用 primefaces 自动完成组件时,我什至无法打开页面。
它的片段是:

<p:autoComplete value="#{indirizzoCtrl.selectedCodiceNazione}"  
completeMethod="#{indirizzoCtrl.completeNazione}"
var="nazione" itemLabel="#{nazione.nome}"
itemValue="#{nazione.codiceNazione}" />

Nazione 是一个 Pojo 类,其中 CodiceNazioneNome are两个字符串字段(肯定有 getter 和 setter)。 completeNazione是 ManagedBean 上的一个方法,它返回 List<Nazione> .
看BalusC解释 here ,在我看来,我不需要任何转换器,因为 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());
}
}

}

现在 View 中的组件看起来像:
<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 .
我究竟做错了什么?

最佳答案

这对我有用:

//Converter
@FacesConverter(value="MarcaConverter")
public class MarcaConverter implements Converter{
MarcaDAO marcaDAO;
public Object getAsObject(FacesContext contet, UIComponent component, String value) {
if(value==null || value.equals(""))
return null;
try{
int id = Integer.parseInt(value);
return marcaDAO.findMarcaById(id);
}catch (Exception e) {
e.printStackTrace();
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Marca no válida", ""));
}
}

public String getAsString(FacesContext contet, UIComponent component, Object value) {
if(value==null || value.equals(""))
return null;
return String.valueOf(((Marca)value).getCodigoMarca());
}
}




//--------------------------------------
//Bean
@ManagedBean
@ViewScoped
public class MyBeans implements Serializable{
private Marca marca;
...
public Marca getMarca(){
return marca;
}
public void setMarca(Marca m){
marca=m;
}
...
public List<Marca> obtenerMarcasVehiculos(String s) {
List<Marca> marcas,smarcas=new ArrayList<Marca>();
try{
marcas= marcaDAO.findAllMarcas();
if(s.trim().equals("")) return marcas;
for(Marca m:marcas)
if (m.getNombreMarca().toString().contains(s) || m.getNombreMarca().toLowerCase().contains(s.toLowerCase())) {
smarcas.add(m);
}
return smarcas;
}catch(Exception e){
//JsfUtil.showFacesMsg(e,"Error al obtener las marcas de veh&iacute;culos","",FacesMessage.SEVERITY_WARN);
e.printStackTrace();
JsfUtil.lanzarException(e);
return null;
}
}


//-----------------------------------------
//*.xhtml page
...
<p:autoComplete
id="cbxMarca" value="#{myBean.marca}" size="40"
converter="MarcaConverter"
completeMethod="#{myBean.obtenerMarcasVehiculos}"
var="m" itemLabel="#{m.nombreMarca}" itemValue="#{m}"
forceSelection="true" dropdown="true"
required="true" scrollHeight="200">
</p:autoComplete>
...

//-----------------------------------------
//Class Marca
public class Marca implements Serializable{
private static final long serialVersionUID = 1L;

private Integer codigoMarca;
private String nombreMarca;
...

关于jsf-2 - primefaces 使用 pojo 自动完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8560073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com