Aplicación funcionando con JSF
, Primefaces
, eclipselink
, no es una aplicación pequeña, alrededor de 100 páginas / frijol todo funciona a la perfección
Tengo la comprensión de algunas dificultades cómo mis @ViewScoped
página funciona, tengo un select
componente de interfaz de usuario, llenos de un simple List<People>
y un back-end selectedPeople
en mi frijol
// all getters, setters, JPA annotations, all good
public class People {
private String name;
private List<Car> cars;
}
@ManagedBean
@ViewScoped
public class PeopleBean {
@EJB
private Service sPeople;
private People selectedPeople;
private List<People> listPpl;
@PostConstruct
public void init(){
listPpl = sPeople.readAll(); // always good, same as DB values
}
public People getSelectedPeople(){
return selectedPeople;
}
public People setSelectedPeople(People p){ // p is an old element
selectedPeople = p; // BREAKPOINT
}
// getter for the list too
public void method(){
Logger.getAnoymousLogger().severe(selectedPeople.getCars()); // the one the old people, not the ne contained in the actual list
}
}
<p:selectOneMenu id="selectP" value="#{peopleBean.selectedPeople}" converted="#{genericSecuerdConverter}" >
<p:ajax event="change" partialSubmit="true" listener="#{peopleBean.method()}" />
<f:selectItems value="#{peopleBean.listPpl}" var="people" itemLabel="#{people.name}" itemValue="#{people}" />
</p:selectOneMenu>
Secuencia de uso y es un problema (información tomada de depuración):
- ir a
peoplePage.xhtml
donde el elemento de selección es,IDs
de un elemento de la lista son#410, #411, #412
(3 personas) - ir a
modif.xhtml
, cambiar las personas (3ª quitar unacar
, guardados en DB (cheque en dB)) - volver a la
peoplePage.xhtml
lista está bien,IDs
en la depuración son#650, #651, #652
- cambiar el valor (de
null
) de la selectUI para elegir un pueblo, y en el punto de interrupción,p
que parece ser el#412
elemento, por lo que los cambios en la lista de su coche no son visibles, que no proviene de lalistPpl
(porque contiene sólo elementos y corresponde válidos a DB), es una especie de almacenamiento en caché
He intentado desactivar ecpliselink caché como estados caché EclipleLink
- cambiar EclipseLink propiedad
- el cambio de la APP Propery
- utilizar
@Cacheable(false)
Nadie tenía un efecto, ni ir a la navegación privada ni borrar la caché del navegador y volver a la página, el p
elemento sigue siendo el viejo de la primera carga
Pensé que @ViewScoped
permite abrir una página cada vez como si fuera la primera vez, pero no parece, no puede figura en la que el elemento puede almacenarse / caché
Editar He utilizado una solución por el momento, pero esto es obviamente la mejor solución o
public People setSelectedPeople(People p){
if(p!=null)
selectedPeople = sPeople.read(p.getId());
}
Lo que se busca es @RequestScoped
. Se va a crear todo lo que cada uno y cada vez que se hace una petición HTTP adecuado. De lo contrario, no se garantiza que destruir los @ViewScoped
granos. Un ejemplo en la documentación Omnifaces: ViewScoped .
Esta característica podría ser utilizado para ayudar a la reconstrucción de la página cuando el usuario está utilizando la parte trasera y botones de avance del navegador, por ejemplo.
@RequestScoped frijol vive tanto tiempo como la vida petición-respuesta HTTP. Que se crea en una petición HTTP y se destruye cuando la respuesta HTTP asociado con la petición HTTP está terminado.
@ViewScoped frijol vive, siempre y cuando el usuario está interactuando con la misma vista en el JSF / pestaña de la ventana del navegador. Que se crea en una petición HTTP y se destruye una vez que las devoluciones de datos de usuario a un punto de vista diferente.
Fuente de la descripción: https://www.tutorialspoint.com/jsf/jsf_managed_beans.htm