Injection at destroy time
lowecg2004 Dec 1, 2006 9:34 AMI have some stateless beans injected into a stateful bean that are only required at destroy time. Currently when destroy is invoked, these beans are null. Code is as follows:
@Name("sessionTimeoutHandler") @Stateful @Scope(ScopeType.SESSION) public class SessionTimeoutHandlerHome implements SessionTimeoutHandler, Serializable { private static final long serialVersionUID = 1L; @Logger private Log log; @In(create=true) private SessionDao sessionDao; // this is stateless @In(create=true) private AuditLog auditLog; // and so is this private Session currentSession; ... @Remove @Destroy public void destroy() { // Session has timed out, so update the user session entry and perform // cleanup. currentSession.setClosed(new Date()); sessionDao.merge(currentSession); auditLog.addAuditEntry("User session timeout for session id #0" currentSession.getId()); log.info("User session timeout for session id #0" currentSession.getId()); } }
Should I be getting the stateless beans injected at this point? I'm sure I've seen this working in the past.
When creating the bean I did notice what I believe to be inconsistent behaviour with respect to @Logger injection. I initially created the bean using method 1 below, by simply specifying the bean as an @Out parameter and instantiating the object within an action. Using this method, the @Logger object on SessionTimeoutHandler was null when @Destroy was called. However, when I changed to method 2 the logger was available - but still no stateless beans.
Creation Method 1 - Using @Out @Name("login") @Stateful @Scope(ScopeType.EVENT) public class LoginAction implements Login, Serializable { @Out(required=false) private SessionTimeoutHandler sessionTimeoutHandler; public String login() { ... SessionTimeoutHandler sessionTimeoutHandler = new SessionTimeoutHandler(); // create a session timeout handler sessionTimeoutHandler.setCurrentSession(currentSession); } } Creation Method 2 - Using @In(create = true) @Name("login") @Stateful @Scope(ScopeType.EVENT) public class LoginAction implements Login, Serializable { @In(create = true) @Out(required = false) private SessionTimeoutHandler sessionTimeoutHandler; public String login() { ... // create a session timeout handler sessionTimeoutHandler.setCurrentSession(currentSession); } }
I am using Seam 1.1 CR2.