springboot predestroy oninit method application java jsf jsf-2 postconstruct

java - predestroy - spring boot on startup



Método @PostConstruct llamado dos veces para la misma solicitud (2)

Es posible que tanto el método init() método @PostConstruct se @PostConstruct y causen este comportamiento. Intente cambiar el nombre del método init() y / o ponerlo en private . Creo que esto puede estar relacionado con sus problemas:

http://javahowto.blogspot.com/2011/07/servlet-init-method-vs-postconstruct.html

También encontré una buena publicación sobre la depuración de los ciclos de vida de JSF aquí: balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html

Estoy usando JSF 2.0 con GlassFish 3.0.

Tengo el siguiente Bean Managed:

@ManagedBean @RequestScoped public class OverviewController{ private List<Event> eventList; @PostConstruct public void init(){ System.out.println("=> OverviewController - init() - enter"); System.out.println("=< OverviewController - init() - exit"); } }

Desde el archivo overview.xhtml estoy llamando a diferentes atributos o métodos de mi OverviewController.

<ui:repeat var="event" value="#{overviewController.eventList}"> ... </ui:repeat>

Todo funciona bien, pero el problema está en el archivo de registro:

INFO: Enter : RESTORE_VIEW 1 INFO: Exit : RESTORE_VIEW 1 INFO: Enter : RENDER_RESPONSE 6 INFO: => OverviewController - init() - enter INFO: => Overview Controller - updateSelectedTab() - enter INFO: =< Overview Controller - updateSelectedTab() - exit INFO: =< OverviewController - init() - exit INFO: => OverviewController - init() - enter INFO: => Overview Controller - updateSelectedTab() - enter INFO: =< Overview Controller - updateSelectedTab() - exit INFO: =< OverviewController - init() - exit INFO: Exit : RENDER_RESPONSE 6

Como puede ver, el método init () se llama dos veces en la misma solicitud sin ninguna razón. Por lo que sé, cualquier método anotado con PostConstruct se llama una vez por cada solicitud. ¿Me equivoco?

EDITAR: No se utiliza AJAX en la página. Revisé el número de peticiones con firebug. Hay peticiones de árboles hechas:

  • 1.Uno para el javax.faces.resource (GET)
  • 2.Uno para el archivo css (GET)
  • 3.Uno para overview.xhtml (GET)

Esto puede suceder si tiene varios marcos que gestionan la misma clase de bean. Por ejemplo, JSF y CDI, o JSF y Spring, o CDI y Spring, etc. Vuelva a comprobar su configuración y anotaciones en el bean.

Eso también puede suceder si está usando CDI y está usando varias anotaciones de @Named toda la clase. Por ejemplo, un @Named directamente en la clase para registrarlo como un bean administrado y otro en un método getter de @Produces . Tendrías que preguntarte si eso es realmente necesario. También puedes usar #{bean.someObject} lugar de #{someObject} .

@Named @RequestScoped public class Bean { @PostConstruct public void init() { // ... } @Named @Produces public SomeObject getSomeObject() { // ... } }

Esto también puede suceder si su bean administrado extiende alguna clase abstracta que a su vez también tiene un @PostConstruct en el método. Debes quitarle la anotación. Alternativamente, debería hacer que el método init sea abstracto y no tener @PostConstruct en el bean de implementación:

public abstract class BaseBean { @PostConstruct public void postConstruct() { init(); } public abstract void init(); }