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();
}