नहीं पकड़ सकता मैं ग्लासफ़िश v3 पर एक जेएसएफ 2.0 एप्लिकेशन विकसित कर रहा हूं और मैं ViewExpiredException को संभालने की कोशिश कर रहा हूं। लेकिन जो कुछ भी मैं करता हूं, मुझे हमेशा अपने स्वयं के त्रुटि पृष्ठ की बजाय ग्लासफ़िश त्रुटि रिपोर्ट प्राप्त होती है।जेएसएफ: ViewExpiredException
वीईई की घटना का अनुकरण करने के लिए, मैंने निम्नलिखित कार्य को मेरे बैकिंग बीन में डाला, जो वीईई को आग लगा देता है। मैं इस जेएसएफ पेज से कमांडलिंक के माध्यम से इस समारोह को ट्रिगर कर रहा हूं। कोड:
@Named
public class PersonHome {
(...)
public void throwVEE() {
throw new ViewExpiredException();
}
}
पहले मैं बस मेरे web.xml को एक त्रुटि पेज जोड़कर इसे करने की कोशिश में:
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/error.xhtml</location>
</error-page>
लेकिन यह काम नहीं करता, मैं त्रुटि के लिए पुनः निर्देशित नहीं कर रहा हूँ लेकिन मैं कर रहा हूँ पता चला Glassfish errorpage है, जो निम्नलिखित सामग्री के साथ एक HTTP स्थिति 500 पृष्ठ दिखाती है:
description:The server encountered an internal error() that prevented it from fulfilling this request.
exception: javax.servlet.ServletException: javax.faces.application.ViewExpiredException
root cause: javax.faces.el.EvaluationException:javax.faces.application.ViewExpiredException
root cause:javax.faces.application.ViewExpiredException
अगला बात मैं करने की कोशिश की लिखने के लिए ExceptionHandlerFactory और एक CustomExceptionHandler, के रूप में डेस था जावासेवरफेस 2.0 में पूरा किया गया - पूर्ण संदर्भ। तो मैं चेहरे-config.xml में निम्नलिखित टैग डाला:
<factory>
<exception-handler-factory>
exceptions.ExceptionHandlerFactory
</exception-handler-factory>
</factory>
और जोड़ा इन कक्षाओं: कारखाना:
package exceptions;
import javax.faces.context.ExceptionHandler;
public class ExceptionHandlerFactory extends javax.faces.context.ExceptionHandlerFactory {
private javax.faces.context.ExceptionHandlerFactory parent;
public ExceptionHandlerFactory(javax.faces.context.ExceptionHandlerFactory parent) {
this.parent = parent;
}
@Override
public ExceptionHandler getExceptionHandler() {
ExceptionHandler result = parent.getExceptionHandler();
result = new CustomExceptionHandler(result);
return result;
}
}
कस्टम अपवाद संचालक:
package exceptions;
import java.util.Iterator;
import javax.faces.FacesException;
import javax.faces.application.NavigationHandler;
import javax.faces.application.ViewExpiredException;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerWrapper;
import javax.faces.context.FacesContext;
import javax.faces.event.ExceptionQueuedEvent;
import javax.faces.event.ExceptionQueuedEventContext;
class CustomExceptionHandler extends ExceptionHandlerWrapper {
private ExceptionHandler parent;
public CustomExceptionHandler(ExceptionHandler parent) {
this.parent = parent;
}
@Override
public ExceptionHandler getWrapped() {
return this.parent;
}
@Override
public void handle() throws FacesException {
for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
ExceptionQueuedEvent event = i.next();
System.out.println("Iterating over ExceptionQueuedEvents. Current:" + event.toString());
ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
Throwable t = context.getException();
if (t instanceof ViewExpiredException) {
ViewExpiredException vee = (ViewExpiredException) t;
FacesContext fc = FacesContext.getCurrentInstance();
NavigationHandler nav =
fc.getApplication().getNavigationHandler();
try {
// Push some useful stuff to the flash scope for
// use in the page
fc.getExternalContext().getFlash().put("expiredViewId", vee.getViewId());
nav.handleNavigation(fc, null, "/login?faces-redirect=true");
fc.renderResponse();
} finally {
i.remove();
}
}
}
// At this point, the queue will not contain any ViewExpiredEvents.
// Therefore, let the parent handle them.
getWrapped().handle();
}
}
लेकिन अभी भी मुझे अपने त्रुटि पृष्ठ पर रीडायरेक्ट नहीं किया गया है - मुझे उपरोक्त की तरह ही HTTP 500 त्रुटि मिल रही है। मैं क्या गलत कर रहा हूं, मेरे कार्यान्वयन में क्या गुम हो सकता है कि अपवाद सही ढंग से संभाला नहीं गया है? कोई भी अत्यधिक सराहना की मदद!
संपादित
ठीक है, मैं ईमानदार हूँ। असल में, मेरा कोड वास्तव में स्कैला में लिखा गया है, लेकिन यह एक लंबी कहानी है। मैंने सोचा कि यह हर समय एक जावा समस्या थी। इस मामले में वास्तविक त्रुटि मेरी खुद की मूर्खता थी। मेरे (स्कैला) कोड में, कस्टमएक्सप्शन हैंडलर में, मैं "i.remove();" के साथ रेखा को जोड़ना भूल गया तो ViewExpiredException इसे संभालने के बाद UnhandledExceptionsQueue में रहा, और यह "बुलबुला हुआ"। और जब यह बुलबुले हो जाता है, तो यह सर्वलेट अपवाद बन जाता है।
मैं आपको दोनों को भ्रमित करने के लिए वास्तव में क्षमा चाहता हूं!
* "तो आप किसी भी JSF चरण में एक ViewExpiredException फेंक कर सकते हैं" *: डिफ़ॉल्ट रूप से, जब आप अपने 1 उदाहरण के रूप में एक सेम के अंदर ऐसा करते हैं, यह एक 'FacesException' में लिपटे किया जाएगा और यह होगा अपेक्षित त्रुटि पृष्ठ में समाप्त नहीं होता है। – BalusC
धन्यवाद। आप सही हैं, मैंने अपने अंतिम संपादन से किसी भी जेएसएफ-चरण-कथन को हटा दिया है। – ifischer
क्या आपकी आखिरी संपादित पोस्ट यह काम कर रही है? मुझे आपके विचारों के लिए ViewExpired त्रुटि के साथ ही –