session scoped variable lost after page action
fredf Aug 15, 2007 12:33 PMHello
I have a facelet view that triggers an page action when it loads.
<page view-id="/userPage.xhtml"> <param name="member" value="#{visitedUserAction.member}" /> <action execute="#{visitedUserAction.initContentProviderAccount}" /> </page>
@Stateful @Name("visitedUserAction") @AutoCreate public class VisitedUserActionBean implements VisitedUserAction { private String segment; private String member; @EJB private ContentProviderAccountDao contentProviderAccountDao; @Out(required = false, scope = ScopeType.SESSION) private ContentProviderAccount contentProviderAccount; @Logger private Log log; public void initContentProviderAccount() { log.info("getting current visited contentProviderAccount for page=" + member); ContentProviderAccount contentProviderAccount = null; try { contentProviderAccount = contentProviderAccountDao.findByStageUrlName(member); log.info("fetched contentProviderAccount=" + contentProviderAccount); if (contentProviderAccount.getProviderSegment().name().toLowerCase() .equals(segment.toLowerCase())) { log.info("setting contentProviderAccount to " + contentProviderAccount); this.contentProviderAccount = contentProviderAccount; } else { // fixme: redirect to either user not found page or search page throw new RuntimeException("user does not exist in segment, however there is one in: " + contentProviderAccount.getProviderSegment().toString()); } } catch (ContentProviderAccountDaoException e) { // fixme: redirect to either user not found page or search page throw new RuntimeException("user is not found "); } } @Create public void logthis() { log.info("will this run?"); } public String getSegment() { return segment; } public void setSegment(String segment) { this.segment = segment; } public String getMember() { return member; } public void setMember(String member) { this.member = member; } @Destroy @Remove public void destroy() { } }
Then I want to find the sessionscoped variable and inject it into another stateful bean.
@javax.ejb.Stateful @Name("artistpresentaton") public class ArtistPresentationActionBean extends com.yourstardom.middle.ArtistPresentationActionBase implements com.yourstardom.middle.ArtistPresentationActionLocal, com.yourstardom.middle.ArtistPresentationActionRemote { @In private ContentProviderAccount contentProviderAccount; ... }
This works fine when I do a non-faces request to the view but when I execute an action in the ArtistPresentationActionBean from the view and the response is rendered, contentProviderAccount is null and I get the exception
Caused by javax.el.ELException with message: "javax.ejb.EJBTransactionRolledbackException: In attribute requires non-null value: artistpresentation.contentProviderAccount"
why?