The way I solved a similar problem was putting into my bean onLoad method
the logic to decide whether or not it had already run or not (having a
private boolean and testing it before running whatever you have to run, plus
setting it on the first run to prevent it from running later).
Although this is a clunky solution if you intend to do it on many beans, you
can consider making your beans extend an abstract one and including this
"rerun-prevention" on the base class.
Francisco Passos
On 6/26/07, bansi <[EMAIL PROTECTED]> wrote:
We have Homegrown Authentication System which on successfull
authentication
returns "EmployeeID" in the form of Request Header Variables.
I am using "afterPhase" method of PhaseListener to call "onPageLoad"
method
of LoginBean by checking the viewId as shown below
if (viewId.endsWith("login.xhtml")) {
String managedBeanName = getManagedBeanNameFromView(viewId);
Object object = facesContext.getApplication
().createValueBinding("#{"
+ managedBeanName + "}").getValue(facesContext);
if (object == null)
logger.error("OnPageLoad cannot be executed, no such managed
bean:"+
managedBeanName);
else {
Login loginBean = (Login) object;
loginBean.onPageLoad();
}
}
public String getManagedBeanNameFromView(String viewId) {
String pageName;
if (viewId.endsWith("login.xhtml")) {
pageName = viewId.substring(1, viewId.length() - 6);
}
else{
pageName = viewId.substring(1, viewId.length() - 10);
}
return pageName+"Bean";
}
public PhaseId getPhaseId()
{
return PhaseId.RESTORE_VIEW;
}
The onPageLoad method of LoginBean retrieves "employeeID" from request
header variables and use employeeID to retrieve userID and userRoles from
database as shown below
public void onPageLoad() {
Map requestHeaderMap =
FacesContext.getCurrentInstance
().getExternalContext().getRequestHeaderMap();
String employeeID = (String) requestHeaderMap.get("EmployeeID");
userId = getUserId(Long.valueOf(employeeID )); // calls database
userRoles = getUserRoles(userId); // calls database
userInfo.setUserId(userId); //userInfo is pojo
userInfo.setUserRoles(userRoles);
/* Store Nams User Id in Session */
HttpSession userSession =
(HttpSession)
FacesContext.getCurrentInstance().getExternalContext()
.getSession(true);
userSession.setAttribute("userInfo", userInfo);
// UserInfoHolder is a Thread Local
UserInfoHolder.setUserInfo(userInfo);
}
The problem is whenever i navigate back & forth between the pages , the
query is fired to retrieve userID and userRoles from database which i
wanna
happen only once i.e. how do i make getUserID() and getUserRoles() method
fire only once
Any pointers/suggestions will be highly appreciated
--
View this message in context:
http://www.nabble.com/Phase-Listener-execute-only-once-----tf3983959.html#a11311025
Sent from the MyFaces - Users mailing list archive at Nabble.com.