Solución:
Esto es por diseño. Solo se destruirá inmediatamente cuando una acción POST dé como resultado una navegación que no es una devolución de datos a la misma vista (es decir, el método de acción no regresó null
o void
, pero un digno String
, incluso cuando está vacío).
los <h:link>
genera un enlace GET que no invoca ninguna acción POST. Como no es posible notificar de manera confiable al servidor mediante una solicitud HTTP (XML) cuando se descarga la vista, no se puede notificar a JSF que destruya el bean con ámbito de vista asociado con la vista. En tal caso, el bean con ámbito de vista solo se destruirá cuando la sesión expire o cuando se supere el número máximo de vistas lógicas en la sesión (el valor predeterminado es 15) y la vista asociada sea la primera en orden.
Si tu De Verdad desea destruir el bean con ámbito de vista mediante una acción de navegación, entonces su mejor opción es convertirlo en una solicitud POST por <h:commandLink>
en su lugar y emitir una redirección devolviendo el resultado de la navegación con ?faces-redirect=true
parámetro. Pero, después de todo, esto no es compatible con SEO, ya que los bots no indexan los enlaces POST.
Después de todo, no me importaría que la vista todavía esté en la sesión. Si tiene la intención de hacer alguna limpieza o registro, buscaría formas alternativas, según el requisito funcional concreto.
En teoría sería posible por HTML DOM onbeforeunload
evento, pero este es un evento no estándar y el comportamiento del navegador no está especificado en cuanto a lo que sucede cuando envía una solicitud ajax durante ese evento. A veces llegará, pero a veces tampoco.
Actualizar: en práctica, esto se ha implementado en OmniFaces @ViewScoped
desde OmniFaces 2.2. Inicialmente con ayuda de XHR sincrónico y desde OmniFaces 2.6 con ayuda de baliza. Funciona bastante bien en los principales navegadores. Desde OmniFaces 2.3, incluso destruye inmediatamente el estado de la vista lateral del servidor JSF asociado y, desde OmniFaces 2.6, incluso destruye inmediatamente los beans físicos, lo que reduce aún más el uso innecesario de memoria. Ver también, entre otros, JSF: Mojarra vs. OmniFaces @ViewScoped: @PreDestroy llamado pero el bean no puede ser recolectado como basura