我试图让两个selectOneMenu嵌套,一个包含省份,第二个包含这些省份的城市,但我有一个错误,当我选择省份时,我无法找出我做错了什么!如果有人能帮我解决这个错误,那已经非常感激了!
错误本身:
SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (default
task-22) javax.faces.component.UpdateModelException:
java.lang.IllegalArgumentException:
Cannot convert 2 of type class java.lang.Integer to class
ar.com.kompass.model.Provincia
at javax.faces.component.UIInput.updateModel(UIInput.java:866)
at javax.faces.component.UIInput.processUpdates(UIInput.java:749)
at com.sun.faces.context.PartialViewContextImpl$Phase
AwareVisitCallback.visit(PartialViewContextImpl.java:577)
at com.sun.faces.component.visit.PartialVisitContext.invoke
VisitCallback(PartialVisitContext.java:183)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1689)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
如果我不明白,消息"无法转换2 ...."指的是所选择的值,在这种情况下是2个省的值,并且不能管理"转换"到省的对象? ....怎么解决这个?生成错误的视图代码:
<p:row>
<p:column>
<p:outputLabel value="Provincia " />
<p:selectOneMenu id="cboProvincia"
value="#{cuentaBean.cuenta.provincia}" required="true"
requiredMessage="Debe seleccionar una provincia"
converter="omnifaces.SelectItemsConverter">
<f:selectItem itemLabel="--Seleccione--" itemValue="#{null}"
noSelectionOption="true" />
<f:selectItems value="#{cuentaBean.lstProvincias}" var="prov"
itemLabel="#{prov.nombre}" itemValue="#{prov.id}" />
<f:ajax event="change"
listener="#{cuentaBean.listarLocalidades()}"
execute="cboProvincia" render="cboLocalidad" />
</p:selectOneMenu>
</p:column>
<p:column>
<p:outputLabel value="Localidad " />
<p:selectOneMenu id="cboLocalidad"
value="#{cuentaBean.cuenta.localidad}" required="true"
requiredMessage="Debe seleccionar una Localidad"
converter="omnifaces.SelectItemsConverter">
<f:selectItem itemLabel="--Seleccione--" itemValue="#{null}"
noSelectionOption="true" />
<f:selectItems value="#{cuentaBean.lstLocalidades}" var="loca"
itemLabel="#{loca.nombre}" itemValue="#{loca}" />
</p:selectOneMenu>
</p:column>
</p:row>
这就是bean:
@Named
@ViewScoped public class CuentaBean implements Serializable {
@Inject
private ICuentaService cuentaService;
@Inject
private Cuenta cuenta;
@Inject
private IProvinciaService provinciaService;
@Inject
private ILocalidadService localidadService;
private List<Cuenta> lstCuentas;
private List<Provincia> lstProvincias;
private List<Localidad> lstLocalidades;
private int codigoProvincia;
public int getCodigoProvincia() {
return codigoProvincia;
}
public void setCodigoProvincia(int codigoProvincia) {
this.codigoProvincia = codigoProvincia;
}
public Cuenta getCuenta() {
return cuenta;
}
public void setCuenta(Cuenta cuenta) {
this.cuenta = cuenta;
}
@PostConstruct
public void init(){
lstCuentas = new ArrayList<>();
lstProvincias = new ArrayList<>();
lstLocalidades = new ArrayList<>();
this.listarProvincias();
}
public List<Cuenta> getLstCuentas() {
return lstCuentas;
}
public void setLstCuentas(List<Cuenta> lstCuentas) {
this.lstCuentas = lstCuentas;
}
public List<Provincia> getLstProvincias() {
return lstProvincias;
}
public void setLstProvincias(List<Provincia> lstProvincias) {
this.lstProvincias = lstProvincias;
}
public List<Localidad> getLstLocalidades() {
return lstLocalidades;
}
public void setLstLocalidades(List<Localidad> lstLocalidades) {
this.lstLocalidades = lstLocalidades;
}
public void listarProvincias() {
try {
//lstCuentas = cuentaService.listar();
lstProvincias= provinciaService.listar();
//lstLocalidades= localidadService.listar(idProv);
} catch (Exception e) {
}
}
public void listarLocalidades
System.out.print(this.codigoProvincia);
lstLocalidades= localidadService.listar(this.codigoProvincia);
} catch (Exception e) {
}
}
}
最后是Model Cuenta,这可能是导致错误的原因:
@Entity @Table(name = "cuenta") public class Cuenta implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "nombre", length = 30, nullable = false)
private String nombre;
@Column(name = "domicilio", length = 30, nullable = false)
private String domicilio;
private short altura;
@OneToOne
@JoinColumn(name="idprov" , nullable = false)
private Provincia provincia;
@OneToOne
@JoinColumn(name="idloca" , nullable = false)
private Localidad localidad;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getDomicilio() {
return domicilio;
}
public void setDomicilio(String domicilio) {
this.domicilio = domicilio;
}
public short getAltura() {
return altura;
}
public void setAltura(short altura) {
this.altura = altura;
}
public Localidad getLocalidad() {
return localidad;
}
public void setLocalidad(Localidad localidad) {
this.localidad = localidad;
}
public Provincia getProvincia() {
return provincia;
}
public void setProvincia(Provincia provincia) {
this.provincia = provincia;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Cuenta other = (Cuenta) obj;
if (id != other.id)
return false;
return true;
}
}
答案 0 :(得分:1)
你错了:
<f:selectItems value="#{cuentaBean.lstProvincias}" var="prov"
itemLabel="#{prov.nombre}" itemValue="#{prov.id}" />
应该是:
<f:selectItems value="#{cuentaBean.lstProvincias}" var="prov"
itemLabel="#{prov.nombre}" itemValue="#{prov}" />
说明:您正在尝试将 provincia 的 id int 设置为 provincia ,这是<强>对象强>