Problema CommandButton JSF. Reconstruye Bean desde 0
Buenas. La verdad es que antes de escribir aqui, me he tirado muchas muchas horas investigando, y no logro dar con nada que me ayude, as铆 que a ver si alguien puede echarme una mano. El tema es:
Tengo un proyecto montado con RichFaces, aunque el problema es de una etiqueta m谩s propia de JSF: , de ah铆 que lo ponga aqui. El proyecto est谩 montado usando Spring y Hibernate, usando TOMCAT 6 y la JRE 1.5.08. El tema es que tengo un formulario, con los datos de un solicitante, relleno. Este formulario es el mismo tanto para dar de alta al solicitante, como para modificarlo. Dependiendo de si se le pasa un Solicitante o no, rellena los campos o no, y muestra el bot贸n de modificar, o crear.
Bien. Crear un solicitante va de lujo. El problema es modificarlo. Tras depurar, me he dado cuenta que al hacer click en el bot贸n "Modificar", coge y me recarga el Bean, me lo reconstruye, y pasa olimpicamente de ir al Action que tiene asignado. Por supuesto, esto hace que piense que estoy creando, en vez de modificando (porque construye el Bean de nuevo), con lo cual, no puedo modificar.
Y lo mas curioso de todo. Si en modo DEBUG hago esto.. funciona!! Pero exactamente el mismo procedimiento, pero en modo RUN en vez de DEBUG, no va.
La verdad es que estoy sin ideas ya. 驴Alguien puede inspirarme? Os dejo la parte del c贸digo del jsp. Hay tambi茅n un . Esto es para probar a ver si es que richfaces queria un bot贸n de los suyos... pero ya digo que, el comportamiengo de este a4j:commandButton es igual que el de h:commandButton, es decir, pasa de mi, y llama al constructor de nuevo, sin llamar al action.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
xmlns:hx="http://www.ibm.com/jsf/html_extended"
xmlns:t="http://myfaces.apache.org/tomahawk"
template="/template/templateTabs.xhtml">
<ui:define name="contentTabs">
<f:facet name="header">
<h:outputText styleClass="formularioFlechaBusqueda"
value="#{mensajes['gpnc.solicitudes.datosSolicitante']}" />
</f:facet>
<rich:tabPanel switchType="client"
selectedTab="#{pc_AltaSolicitante.SPestanaSeleccionada}">
<rich:tab id="datosPersonalesTab"
label="#{mensajes['gpnc.solicitantes.datosPersonales']}">
<f:subview>
<ui:include src="tabs/datosPersonalesTab.xhtml" />
</f:subview>
</rich:tab>
<rich:tab id="datosResidenciaTab"
label="#{mensajes['gpnc.solicitantes.datosResidencia']}">
<f:subview>
<ui:include src="tabs/datosResidenciaTab.xhtml" />
</f:subview>
</rich:tab>
<rich:tab id="datosEconomicosTab"
label="#{mensajes['gpnc.solicitantes.datosEconomicos']}">
<f:subview>
<ui:include src="tabs/datosEconomicosTab.xhtml" />
</f:subview>
</rich:tab>
</rich:tabPanel>
</ui:define>
<ui:define name="contentExtras">
<h:panelGrid id="gridBotonesInsertar" columns="1"
styleClass="filaBotones">
<rich:panel styleClass="transparente">
<a4j:commandButton styleClass="botones" action="#{pc_AltaSolicitante.doCrear}"
rendered="#{pc_AltaSolicitante.BEstamosModificando}"
value="#{mensajes['gpnc.btModificar']}" >
</a4j:commandButton>
<h:commandButton styleClass="botones" action="#{pc_AltaSolicitante.doCrear}"
rendered="#{pc_AltaSolicitante.BEstamosModificando}" immediate="true"
value="#{mensajes['gpnc.btModificar']}">
</h:commandButton>
<h:commandButton styleClass="botones"
rendered="#{!pc_AltaSolicitante.BEstamosModificando}"
value="#{mensajes['gpnc.btCrear']}"
action="#{pc_AltaSolicitante.doCrear}">
</h:commandButton>
<h:commandButton styleClass="botones"
value="#{mensajes['gpnc.btCancelar']}"
action="#{pc_AltaSolicitante.doCancelar}" immediate="true">
</h:commandButton>
</rich:panel>
</h:panelGrid>
</ui:define>
</ui:composition>
Tengo un proyecto montado con RichFaces, aunque el problema es de una etiqueta m谩s propia de JSF: , de ah铆 que lo ponga aqui. El proyecto est谩 montado usando Spring y Hibernate, usando TOMCAT 6 y la JRE 1.5.08. El tema es que tengo un formulario, con los datos de un solicitante, relleno. Este formulario es el mismo tanto para dar de alta al solicitante, como para modificarlo. Dependiendo de si se le pasa un Solicitante o no, rellena los campos o no, y muestra el bot贸n de modificar, o crear.
Bien. Crear un solicitante va de lujo. El problema es modificarlo. Tras depurar, me he dado cuenta que al hacer click en el bot贸n "Modificar", coge y me recarga el Bean, me lo reconstruye, y pasa olimpicamente de ir al Action que tiene asignado. Por supuesto, esto hace que piense que estoy creando, en vez de modificando (porque construye el Bean de nuevo), con lo cual, no puedo modificar.
Y lo mas curioso de todo. Si en modo DEBUG hago esto.. funciona!! Pero exactamente el mismo procedimiento, pero en modo RUN en vez de DEBUG, no va.
La verdad es que estoy sin ideas ya. 驴Alguien puede inspirarme? Os dejo la parte del c贸digo del jsp. Hay tambi茅n un . Esto es para probar a ver si es que richfaces queria un bot贸n de los suyos... pero ya digo que, el comportamiengo de este a4j:commandButton es igual que el de h:commandButton, es decir, pasa de mi, y llama al constructor de nuevo, sin llamar al action.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
xmlns:hx="http://www.ibm.com/jsf/html_extended"
xmlns:t="http://myfaces.apache.org/tomahawk"
template="/template/templateTabs.xhtml">
<ui:define name="contentTabs">
<f:facet name="header">
<h:outputText styleClass="formularioFlechaBusqueda"
value="#{mensajes['gpnc.solicitudes.datosSolicitante']}" />
</f:facet>
<rich:tabPanel switchType="client"
selectedTab="#{pc_AltaSolicitante.SPestanaSeleccionada}">
<rich:tab id="datosPersonalesTab"
label="#{mensajes['gpnc.solicitantes.datosPersonales']}">
<f:subview>
<ui:include src="tabs/datosPersonalesTab.xhtml" />
</f:subview>
</rich:tab>
<rich:tab id="datosResidenciaTab"
label="#{mensajes['gpnc.solicitantes.datosResidencia']}">
<f:subview>
<ui:include src="tabs/datosResidenciaTab.xhtml" />
</f:subview>
</rich:tab>
<rich:tab id="datosEconomicosTab"
label="#{mensajes['gpnc.solicitantes.datosEconomicos']}">
<f:subview>
<ui:include src="tabs/datosEconomicosTab.xhtml" />
</f:subview>
</rich:tab>
</rich:tabPanel>
</ui:define>
<ui:define name="contentExtras">
<h:panelGrid id="gridBotonesInsertar" columns="1"
styleClass="filaBotones">
<rich:panel styleClass="transparente">
<a4j:commandButton styleClass="botones" action="#{pc_AltaSolicitante.doCrear}"
rendered="#{pc_AltaSolicitante.BEstamosModificando}"
value="#{mensajes['gpnc.btModificar']}" >
</a4j:commandButton>
<h:commandButton styleClass="botones" action="#{pc_AltaSolicitante.doCrear}"
rendered="#{pc_AltaSolicitante.BEstamosModificando}" immediate="true"
value="#{mensajes['gpnc.btModificar']}">
</h:commandButton>
<h:commandButton styleClass="botones"
rendered="#{!pc_AltaSolicitante.BEstamosModificando}"
value="#{mensajes['gpnc.btCrear']}"
action="#{pc_AltaSolicitante.doCrear}">
</h:commandButton>
<h:commandButton styleClass="botones"
value="#{mensajes['gpnc.btCancelar']}"
action="#{pc_AltaSolicitante.doCancelar}" immediate="true">
</h:commandButton>
</rich:panel>
</h:panelGrid>
</ui:define>
</ui:composition>
No tengo bien claro tu problema, pero una consulta, si dices que usas la misma pagina para crear y tambien para modificar, y que estas acciones dependen de que lo que le pases al bean, se supone que cuando uno hace un crear se hace una nueva instancia de un objeto (ejem. Persona p=new Persona() ) y cuando uno hace un modificar lo que tendria que hacer es coger el objeto que le estas pasando y modificarlo, ahora en ambos casos tu le estas pasando un objeto y en ambos casos se estan llenando o cambiando datos y si esto es asi como diferencias cuando es modificar y cuando es crear (anocer que tengas un flag x ahi). He visto que usas el mismo metodo para ambos casos.
