Jsf Primefaces:表单字段未自动与托管Bean同步

Jsf Primefaces:表单字段未自动与托管Bean同步,jsf,primefaces,Jsf,Primefaces,祝你今天愉快。我不知道我是否错了。我的xhtml中有这样一个表单: <p:outputLabel value="Número de pasajeros" />: <p:inputText value="#{vueloMB.instancia.numPasajeros}" maxlength="3" > </p:inputText> <br /> <p:outputLabel value="Hora de

祝你今天愉快。我不知道我是否错了。我的xhtml中有这样一个表单:

    <p:outputLabel value="Número de pasajeros" />:
    <p:inputText value="#{vueloMB.instancia.numPasajeros}" maxlength="3" >
    </p:inputText>
    <br />
    <p:outputLabel value="Hora de salida" />:
    <p:calendar value="#{vueloMB.instancia.fechaHoraSalida}" navigator="true"
    mode="popup" pattern="dd/MM/yyyy HH:mm" />
    <br />

    <p:outputLabel value="Avión" />:
    <p:selectOneMenu value="#{vueloMB.instancia.avion}" >
        <f:selectItems value="#{vueloMB.aviones}" var="avi"
            itemLabel="#{avi.modelo}" itemValue="#{avi}" />
    </p:selectOneMenu>
    <br />
    <p:outputLabel value="Pais de salida" />:
    <p:selectOneMenu value="#{vueloMB.instancia.paisSalida}" converter="omnifaces.SelectItemsConverter" >
        <f:selectItems value="#{vueloMB.paises}" var="pai"
            itemLabel="#{pai.nombre}" itemValue="#{pai}" />
        <f:param name="tipoPais" value="S"></f:param>
        <p:ajax update="ciusal" listener="#{vueloMB.cargarListaCiudades}" process="@this" >
        </p:ajax>
    </p:selectOneMenu>
    <br />
    <p:outputLabel value="Ciudad de salida" />:
    <p:selectOneMenu value="#{vueloMB.instancia.ciudadSalida}"  converter="omnifaces.SelectItemsConverter"
        id="ciusal" disabled="#{vueloMB.instancia.paisSalida==null}" >
        <f:selectItems value="#{vueloMB.ciudadesSalida}" var="ciu"
            itemLabel="#{ciu.nombre}" itemValue="#{ciu}" />
    </p:selectOneMenu>
    <br />
    <p:commandButton value="Guardar" rendered="#{vueloMB.instancia.id == null}" action="#{vueloMB.guardar()}" process="@form" ajax="true" />
</h:form>
<p:inputText value="#{vueloMB.instancia.numPasajeros}" maxlength="3" >
    <p:ajax />
</p:inputText>


:
:
:
:
标签为“Ciudad de salida”的下拉列表刷新了另一个下拉列表,我在这里选择了一个国家,更新了第二个下拉列表的列表,效果很好。问题是当我按下“Guardar”按钮用JPA保存实体(vueloMB.instancia是我的实体)时,因为它什么都不做

因此,我在按钮中添加了属性immediate=“true”,它调用ManagedBean方法,但当我看到实体时,只有字段vueloMB.instancecia.paisSalida不为null,即使我填充了所有字段。因此,我假设,因为下拉菜单调用MB方法,因为它刷新了第二个下拉菜单,所以它的值在MB上刷新。基于此,我修改了第一个字段,如下所示:

    <p:outputLabel value="Número de pasajeros" />:
    <p:inputText value="#{vueloMB.instancia.numPasajeros}" maxlength="3" >
    </p:inputText>
    <br />
    <p:outputLabel value="Hora de salida" />:
    <p:calendar value="#{vueloMB.instancia.fechaHoraSalida}" navigator="true"
    mode="popup" pattern="dd/MM/yyyy HH:mm" />
    <br />

    <p:outputLabel value="Avión" />:
    <p:selectOneMenu value="#{vueloMB.instancia.avion}" >
        <f:selectItems value="#{vueloMB.aviones}" var="avi"
            itemLabel="#{avi.modelo}" itemValue="#{avi}" />
    </p:selectOneMenu>
    <br />
    <p:outputLabel value="Pais de salida" />:
    <p:selectOneMenu value="#{vueloMB.instancia.paisSalida}" converter="omnifaces.SelectItemsConverter" >
        <f:selectItems value="#{vueloMB.paises}" var="pai"
            itemLabel="#{pai.nombre}" itemValue="#{pai}" />
        <f:param name="tipoPais" value="S"></f:param>
        <p:ajax update="ciusal" listener="#{vueloMB.cargarListaCiudades}" process="@this" >
        </p:ajax>
    </p:selectOneMenu>
    <br />
    <p:outputLabel value="Ciudad de salida" />:
    <p:selectOneMenu value="#{vueloMB.instancia.ciudadSalida}"  converter="omnifaces.SelectItemsConverter"
        id="ciusal" disabled="#{vueloMB.instancia.paisSalida==null}" >
        <f:selectItems value="#{vueloMB.ciudadesSalida}" var="ciu"
            itemLabel="#{ciu.nombre}" itemValue="#{ciu}" />
    </p:selectOneMenu>
    <br />
    <p:commandButton value="Guardar" rendered="#{vueloMB.instancia.id == null}" action="#{vueloMB.guardar()}" process="@form" ajax="true" />
</h:form>
<p:inputText value="#{vueloMB.instancia.numPasajeros}" maxlength="3" >
    <p:ajax />
</p:inputText>

我在inputText中添加了ajax标记。这样做之后,我按下“Guardar”按钮,我修改的字段(Número de pasajeros)现在带有vueloMB.Instancecia.numPasajeros上的值

因此,如果我添加到所有字段中,当我按下submit按钮时,它将工作,它将毫无问题地保存实体,并且所有字段都将传输到托管bean,但是每个字段都需要这样做吗?JSF没有自动完成这项任务的方法吗?或者我的代码有问题

编辑:下面是托管bean的代码。具有@ConversationScope的CDI托管Bean:

package com.saplic.fut.beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import com.saplic.fut.daos.VueloDAO;
import com.saplic.fut.entity.Avion;
import com.saplic.fut.entity.Ciudad;
import com.saplic.fut.entity.Pais;
import com.saplic.fut.entity.Vuelo;

@Named("vueloMB")
@ConversationScoped
public class VueloManagedBean implements Serializable {

    private static final long serialVersionUID = -203436251219946811L;

    @Inject
    private VueloDAO vueloDAO;

    @Inject
    private Conversation conversation;

    @PostConstruct
    public void iniciarConversacion() {
        if(conversation.isTransient())
            conversation.begin();
    }

    public void finalizarConversacion() {
        if(!conversation.isTransient())
            conversation.end();
    }

    private Vuelo instancia;
    private List<Vuelo> vuelos;
    private List<Avion> aviones = new ArrayList<Avion>();
    private List<Pais> paises = new ArrayList<Pais>();
    private List<Ciudad> ciudadesSalida = new ArrayList<Ciudad>();
    private List<Ciudad> ciudadesAterrizaje = new ArrayList<Ciudad>();
    private Integer idVuelo;

    public String cargarLista() {
        iniciarConversacion();
        vuelos = vueloDAO.cargarVuelos();
        return "/vuelos/lista";
    }

    public void cargarListaCiudades() {
        String tipoLista = FacesContext.getCurrentInstance().
                getExternalContext().getRequestParameterMap().get("tipoPais");
        if(tipoLista.equalsIgnoreCase("S"))
            setCiudadesSalida(vueloDAO.cargarCiudades(getInstancia().getPaisSalida()));
        if(tipoLista.equalsIgnoreCase("A"))
            setCiudadesAterrizaje(vueloDAO.cargarCiudades(getInstancia().getPaisAterrizaje()));
    }

    public String cargarDetalle() { 
        Vuelo fltVuelo = new Vuelo();
        fltVuelo.setId(getIdVuelo());
        instancia = vueloDAO.cargarDetalle(fltVuelo);
        if(instancia == null)
            setInstancia(new Vuelo());
        //Cargamos lista de aviones para combo
        setAviones(vueloDAO.cargarAviones());
        setPaises(vueloDAO.cargarPaises());
        return "/vuelos/detalle";
    }

    public String guardar() {
        vueloDAO.guardar(instancia);
        finalizarConversacion();
        return cargarLista();
    }

    public String actualizar() {
        vueloDAO.actualizar(instancia);
        finalizarConversacion();
        return cargarLista();
    }

    public String eliminar() {
        vueloDAO.eliminar(instancia);
        finalizarConversacion();
        return cargarLista();
    }

    public Vuelo getInstancia() {
        return instancia;
    }

    public void setInstancia(Vuelo instancia) {
        this.instancia = instancia;
    }

    public List<Vuelo> getVuelos() {
        return vuelos;
    }

    public void setVuelos(List<Vuelo> vuelos) {
        this.vuelos = vuelos;
    }

    public Integer getIdVuelo() {
        return idVuelo;
    }

    public void setIdVuelo(Integer idVuelo) {
        this.idVuelo = idVuelo;
    }

    public List<Avion> getAviones() {
        return aviones;
    }

    public void setAviones(List<Avion> aviones) {
        this.aviones = aviones;
    }

    public List<Pais> getPaises() {
        return paises;
    }

    public void setPaises(List<Pais> paises) {
        this.paises = paises;
    }

    public List<Ciudad> getCiudadesSalida() {
        return ciudadesSalida;
    }

    public void setCiudadesSalida(List<Ciudad> ciudadesSalida) {
        this.ciudadesSalida = ciudadesSalida;
    }

    public List<Ciudad> getCiudadesAterrizaje() {
        return ciudadesAterrizaje;
    }

    public void setCiudadesAterrizaje(List<Ciudad> ciudadesAterrizaje) {
        this.ciudadesAterrizaje = ciudadesAterrizaje;
    }       
}
package com.saplic.fut.beans;
导入java.io.Serializable;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Map;
导入javax.annotation.PostConstruct;
导入javax.enterprise.context.Conversation;
导入javax.enterprise.context.ConversationScope;
导入javax.faces.context.FacesContext;
导入javax.inject.inject;
导入javax.inject.Named;
导入com.saplic.fut.daos.VueloDAO;
导入com.saplic.fut.entity.Avion;
导入com.saplic.fut.entity.Ciudad;
导入com.saplic.fut.entity.Pais;
导入com.saplic.fut.entity.Vuelo;
@命名(“vueloMB”)
@会话范围
公共类VuelManagedBean实现可序列化{
私有静态最终长serialVersionUID=-203436251219946811L;
@注入
私人武埃洛道武埃洛道;
@注入
私人谈话;
@施工后
在CIARCONVERSACION()中的公共无效{
if(conversation.isTransient())
对话。开始();
}
公共部门:ArconVersacion(){
如果(!conversation.isTransient())
会话结束();
}
私人Vuelo instancia;
私人名单;
private List aviones=new ArrayList();
私有列表paises=newarraylist();
私有列表ciudadesSalida=新ArrayList();
私有列表ciudadesAterrizaje=new ArrayList();
私有整数idVuelo;
公共字符串cargarLista(){
iniciarConversacion();
vuelos=vueloDAO.cargarVuelos();
返回“/vuelos/lista”;
}
公共空间cargarListaCiudades(){
字符串tipoLista=FacesContext.getCurrentInstance()。
getExternalContext().getRequestParameterMap().get(“tipoPais”);
if(tipoLista.equalsIgnoreCase(“S”))
setCiudadesSalida(vueloDAO.cargarCiudades(getInstancia().getPaisSalida());
if(tipoLista.equalsIgnoreCase(“A”))
setciudadersaterrizaje(vueloDAO.cargarCiudades(getInstancia().getPaisAterrizaje());
}
公共字符串cargarDetalle(){
Vuelo fltVuelo=新的Vuelo();
setId(getIdVuelo());
instancia=vueloDAO.cargarDetalle(fltVuelo);
if(instancia==null)
setInstancia(新Vuelo());
//Cargamos lista de aviones para combo
setAviones(vueloDAO.cargarAviones());
setPaises(vueloDAO.cargarPaises());
返回“/vuelos/detalle”;
}
公共字符串guardar(){
瓜达尔(instancia);
完成ArconVersacion();
返回cargarLista();
}
公共字符串{
vueloDAO.actualizar(instancia);
完成ArconVersacion();
返回cargarLista();
}
公共字符串eliminar(){
埃利米纳尔;
完成ArconVersacion();
返回cargarLista();
}
公共Vuelo getInstancia(){
返回瞬间;
}
公共无效setInstancia(Vuelo instancia){
this.instancia=instancia;
}
公共列表getVuelos(){
返回vuelos;
}
公共void setVuelos(列出vuelos){
this.vuelos=vuelos;
}
公共整数getIdVuelo(){
返回idVuelo;
}
公共void setIdVuelo(整数idVuelo){
this.idVuelo=idVuelo;
}
公共列表getAviones(){
返回鸟;
}
公共作废设置文件(列出文件){
这个。aviones=aviones;
}
公共列表getPaises(){
退票;
}
公共无效设置页(列表页){
this.paises=paises;
}
公共列表getCiudadesSalida(){
返回ciudadesSalida;
}
公共无效设置ciudadesSalida(列表ciudadesSalida){
this.ciudadesSalida=ciudadesSalida;
}
公共列表GetCiudaderSaterrizaje(){
返回ciudadesAterrizaje;
}
公共无效设置ciudadesAterrizaje(列表ciudadesAterrizaje){
this.ciudadesAterrizaje=ciudadesAterrizaje;
}       
}

问候

您的实体必须实现中指定的方法
equals()
hashCode()
toString
。因为我不熟悉omnifaces和ConversationScope,所以我只能帮你这么多。我认为这是因为这两个对象在内存中不在同一位置,所以当您使用
equals