org.jboss.weld.context.NonexistentConversationException: WELD-000321 No conversation found to restore for id 1
jokrasa Sep 15, 2011 3:56 PMHello I'm trying to find a way to catch and redirect back to the login (restore a converstion or start a new one)
in web.xml I have...
<session-config> <session-timeout>1</session-timeout> </session-config>
and
<context-param> <param-name>org.apache.myfaces.ERROR_HANDLER</param-name> <param-value>org.mcgill.phire.jsf.exception.MyExceptionHandler</param-value> </context-param>
so this will throw the
org.jboss.weld.context.NonexistentConversationException: WELD-000321 No conversation found to restore for id 1 error
I try to handle it...
in faces-config I have...
<factory> <exception-handler-factory>org.mcgill.phire.jsf.exception.MyExceptionHandlerFactory</exception-handler-factory> </factory>
public class MyExceptionHandlerFactory extends ExceptionHandlerFactory {
private ExceptionHandlerFactory parent;
// this injection handles jsf
public MyExceptionHandlerFactory(ExceptionHandlerFactory parent) {
this.parent = parent;
}
//create your own ExceptionHandler
@Override
public ExceptionHandler getExceptionHandler() {
ExceptionHandler result =
new MyExceptionHandler(parent.getExceptionHandler());
return result;
}
}
--------------------------------------------------------
@HandlesExceptions
public class MyExceptionHandler extends ExceptionHandlerWrapper {
//private static Log log = LogFactory.getLog(MyExceptionHandler.class);
private static final Logger LOG = LoggerFactory.getLogger(MyExceptionHandler.class);
private ExceptionHandler wrapped;
public MyExceptionHandler(ExceptionHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public ExceptionHandler getWrapped() {
return wrapped;
}
@Override
public void handle() throws FacesException {
//Iterate over all unhandeled exceptions
Iterator i = getUnhandledExceptionQueuedEvents().iterator();
while (i.hasNext()) {
ExceptionQueuedEvent event = (ExceptionQueuedEvent)i.next();
ExceptionQueuedEventContext context =
(ExceptionQueuedEventContext)event.getSource();
//obtain throwable object
Throwable t = context.getException();
//here you do what ever you want with exception
try{
//log error
LOG.error("Serious error happened!", t);
ExceptionHandlerUtil.handleNavigationWithError("m300123");
//redirect to error view etc....
}finally{
//after exception is handeled, remove it from queue
i.remove();
}
}
//let the parent handle the rest
getWrapped().handle();
}
}
----------------------------------------------------
TRYING EVERYTHING HERE BUT ALWAYS AN UNHANDLED CONVERSATION
@HandlesExceptions
public class ExceptionHandlerUtil {
private static final Logger LOG = LoggerFactory.getLogger(MyExceptionHandler.class);
private static BeanManager mgr = null;
private ExceptionHandlerUtil() {
//no-op
}
protected static void handleNavigationWithError(String errorNumber) {
handleNavigationWithError(errorNumber, null, null);
}
private static BeanManager getBeanManager() {
if (mgr == null) {
ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
mgr = (BeanManager) ctx.getAttribute(BeanManager.class.getName());
}
return mgr;
}
protected static void handleNavigationWithError(String errorNumber, String parameterName, Object parameterValue) {
FacesContext fc = FacesContext.getCurrentInstance();
//check for conversation context - this doesn't work...
/* try {
BeanManager bm = getBeanManager();
//(BeanManager)new InitialContext().lookup("java:comp/BeanManager");
if (bm.isScope(ConversationScoped.class)) {
Set<Bean<?>> conversations = bm.getBeans(Conversation.class);
//for (javax.enterprise.inject.spi.Bean b : conversations) {
// for(org.jboss.weld.bean.builtin.ConversationBean b : conversations){
// Conversation c = (Conversation) b;
// if (!c.isTransient()) {
// c.end();
// }
// }
}
} catch (Exception ex) {
//no-op
}*/
// ConversationContext conversationContext = fc.getExternalContext().instance()
// .deploymentManager().instance().select(Context.class)
// .select(HttpConversationContext.class).get();
//
// conversationContext.activate(null);
Map<String, Object> requestMap = fc.getExternalContext().getRequestMap();
NavigationHandler nav = fc.getApplication().getNavigationHandler();
if (parameterName != null) {
requestMap.put(parameterName, parameterValue);
}
fc.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, errorNumber, null));
try{
nav.handleNavigation(fc, null, "go_to_login");
fc.renderResponse();
}
catch (Exception e) {
// FacesContext ctx = FacesContext.getCurrentInstance();
// ExceptionQueuedEventContext eventContext = new ExceptionQueuedEventContext(ctx, e);
// eventContext.getAttributes().put("key", "org.jboss.weld.context.NonexistentConversationException");
// ctx.getApplication().publishEvent(ctx, ExceptionQueuedEvent.class, eventContext);
/* HttpServletResponse response = (HttpServletResponse)fc.getExternalContext().getResponse();
response.addHeader("Pragma", "no-cache");
response.addHeader("Cache-Control", "no-cache");
// Stronger according to blog comment below that references HTTP spec
response.addHeader("Cache-Control", "no-store");
response.addHeader("Cache-Control", "must-revalidate");
// some date in the past
response.addHeader("Expires", "Mon, 8 Aug 2006 10:00:00 GMT");
try{
response.sendRedirect("/login/login.xhtml"); //jsf?faces-redirect=true");
}
catch(Exception ex){
LOG.error(e.getMessage());
}*/
}
}
}
Surely there must be something simple to catch/handle a session timeout or lost conversation?
I am using GlassFish 3.1.1 all updated...
the session timeout is intentional but I want to redirect back to the login/landing...
Any help/suggestions greatly appreciated..
Best Regards,
JOHN.