2010-05-26 3 views
1

Я бросаю исключение NullPointerException в java bean и вылавливаю исключение в FacesServletWrapper. in FacesServletWrapper Я получаю всегда только ServletException.FacesMessages in MyFacesServlet Wrapper

  1. Как я могу уловить конкретное исключение, которое я выбрал?

  2. Как я могу продолжить, откуда я выбрал исключение?

в моей фасоли:

public String getSize() { 
    try { 
    Object object = null; 
    object.equals(""); 

    } catch (Exception e) { 
    throw new NullPointerException(); 
    } 


} 

мой сервлет:

public class FacesServletWrapper extends MyFacesServlet { 

public static final String CONFIG_FILES_ATTR = "javax.faces.CONFIG_FILES"; 
public static final String LIFECYCLE_ID_ATTR = "javax.faces.LIFECYCLE_ID"; 

private ServletConfig servletConfig; 
private FacesContextFactory facesContextFactory; 
private Lifecycle lifecycle; 

@Override 
public void service(ServletRequest request, ServletResponse response) throws IOException, ServletException { 
    FacesContext facesContext = facesContextFactory.getFacesContext(servletConfig.getServletContext(), request, response, (javax.faces.lifecycle.Lifecycle) lifecycle); 
    try { 
    super.service(request, response); 
    } catch (Throwable e) { 
    Locale locale = (Locale) facesContext.getExternalContext().getSessionMap().get(Constants.LOCALE); 
    ServletContext context = servletConfig.getServletContext(); 
    RequestDispatcher dispatcher = context.getRequestDispatcher("/errors/error.jsf"); 

    if (e instanceof NullPointerException) { 
         //here I catch only ServletException 
    String error = ResourceUtil.getMessage("Login_failed", locale); 
    facesContext.getExternalContext().getSessionMap().put("error", error); 
    dispatcher.forward(request, response); 
    ((HttpServletResponse) response).sendRedirect(((HttpServletRequest) request).getContextPath() + "/errors/error.jsf"); 
    } 
    } 

} 

public void destroy() { 
    servletConfig = null; 
    facesContextFactory = null; 
    lifecycle = null; 
} 

public ServletConfig getServletConfig() { 
    return servletConfig; 
} 

private String getLifecycleId() { 
    String lifecycleId = servletConfig.getServletContext().getInitParameter(LIFECYCLE_ID_ATTR); 
    return lifecycleId != null ? lifecycleId : LifecycleFactory.DEFAULT_LIFECYCLE; 
} 

@Override 
public void init(ServletConfig servletConfig) throws ServletException { 
    super.init(servletConfig); 
    this.servletConfig = servletConfig; 
    facesContextFactory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); 
    LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY); 
    lifecycle = (Lifecycle) lifecycleFactory.getLifecycle(getLifecycleId()); 
} 
} 

Спасибо!

+0

Не могли бы вы предоставить трассировку стека, чтобы мы могли видеть, куда ее бросают? – FrustratedWithFormsDesigner

ответ

0

Вы звоните FacesServlet#service() здесь:

try { 
    super.service(request, response); 
} catch (Throwable e) { 
    // ... 
} 

Вот выдержка из its javadoc, чтобы узнать, какие исключения она может бросить:

Если FacesException брошено в любом случае, извлечь причина от FacesException. Если причиной является null, извлеките сообщение из FacesException, поместите его в новый экземпляр ServletException и передайте экземпляр FacesException в качестве основной причины, затем сверните экземпляр ServletException. Если причиной является экземпляр ServletException, восстановите причину. Если причиной является экземпляр IOException, восстановите причину. В противном случае создайте новый экземпляр ServletException, передав сообщение от причины в качестве первого аргумента и сам по себе в качестве второго аргумента.

Другими словами, это будет всегда бросок либо ServletException или IOException. Вам нужно использовать Throwable#getCause(), чтобы извлечь искомую причину из уловленного ServletException, а затем определить ее. Например.

if (e.getCause() instanceof NullPointerException) { 
    // ... 
} 
+0

Привет! Я понял, что мне пришлось пройти через 4 e.getCause() следующим образом: e.getCause(). GetCause(). GetCause(). GetCause(). Мне, вероятно, придется зацикливаться до тех пор, пока я не получу нулевой результат, а предыдущий станет моим исключением. У вас есть ответ на мой второй вопрос - Как я могу продолжить, откуда я выбрал исключение? Я имею в виду, я хотел бы поймать исключение и вернуться к коду пользователя в bean-компоненте, как если бы это обычная попытка {} catch {} в bean-компоненте? – Rivki