2016-08-04 3 views
0

У меня есть Servlet API, где я использовал, чтобы бросить свои собственные исключения из сервлеты уровняобработчик исключений работает для doGet(), но не для doPost()

Когда я бросаю исключение из метода doGet все работает отлично и исключение обработчика улавливает и обрабатывает мое исключение. проблема возникает, когда я бросаю исключение из метода doPost. в данном случае к сожалению, я никогда не видел страница ошибки

web.xml

<error-page> 
    <exception-type>java.lang.Throwable</exception-type > 
    <location>/ErrorHandler</location> 
</error-page> 

обработчика исключений

@WebServlet("/ErrorHandler") 
public class ErrorHandler extends HttpServlet { 

    private final Logger logger; 

    public ErrorHandler() { 
     logger = Logger.getLogger(ErrorHandler.class); 
    } 

    @Override 
    public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException, ServletException { 
     Throwable throwable = (Throwable) httpServletRequest.getAttribute(RequestDispatcher.ERROR_EXCEPTION); 
     logger.error("occurred exception: ", throwable); 
     httpServletRequest.getRequestDispatcher("/error.jsp").forward(httpServletRequest, httpServletResponse); 
    } 
} 

Servlet

@Override 
public void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { 
    throw new UserException("error message"); 
} 

ответ

1

Добавить в ваш ErrorHandler

@Override 
public void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException, ServletException { 
    Throwable throwable = (Throwable) httpServletRequest.getAttribute(RequestDispatcher.ERROR_EXCEPTION); 
    logger.error("occurred exception: ", throwable); 
    httpServletRequest.getRequestDispatcher("/error.jsp").forward(httpServletRequest, httpServletResponse); 
} 

Чтобы избежать дублирования кода рассмотреть возможность создания третьего метода

private void processError(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { 
    Throwable throwable = (Throwable) httpServletRequest.getAttribute(RequestDispatcher.ERROR_EXCEPTION); 
    logger.error("occurred exception: ", throwable); 
    httpServletRequest.getRequestDispatcher("/error.jsp").forward(httpServletRequest, httpServletResponse); 
} 

и ссылаться на него как из doGet() и doPost()

@Override 
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { 
    processError(req, resp);  
} 

@Override 
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { 
    processError(req, resp);  
} 
Смежные вопросы