两个selectOneMenu嵌套

时间:2017-09-28 09:37:56

标签: jsf selectonemenu

我试图让两个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;
 }
}

1 个答案:

答案 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 ,这是<强>对象