在我的应用程序中,我为异常情况抛出了WebApplicationExceptions,这样我就可以用500s传回好消息。我遇到的问题是我有一个用于hibernate事务的servlet过滤器,并且注意到WebApplicationException在它返回到servlet过滤器之前被捕获了。我已经包含了我的servlet过滤器的简短版本作为示例。注意:我只有一个其他servlet过滤器,它进行身份验证并且没有捕获
try {
em = MauiPersistenceUtil.getEntityManager();
em.getTransaction().begin();
// raises WebApplicationException
filterChain.doFilter(request, response);
// since WebApplicationException is trapped somewhere else up
// the filterChain bad data is committed here
em.getTransaction().commit();
} catch (Throwable ex) {
// I want the WebApplicationException to reach here
em.getTransaction().rollback();
}
谢谢, 赎金
编辑:Ryan Stewart指出我实际上并没有问过一个问题。我的问题是:如何在servlet过滤器中告知filterChain中是否抛出了Web应用程序异常?我期待泽西岛会重新抛出异常,但这是不正确的。答案 0 :(得分:4)
由于你没有提出具体问题,我会做一些观察。
答案 1 :(得分:1)
您应该在“doFilter”之后检查响应状态:
filterChain.doFilter(servletRequest, servletResponse);
Integer status = ((HttpServletResponse) servletResponse).getStatus();
if (HttpServletResponse.SC_INTERNAL_SERVER_ERROR.equals(status) {
em.getTransaction().rollback();
} else {
em.getTransaction().commit();
}
如果Status为500,则回滚,就这么简单。你永远不会在Servlet过滤器上获得WebApplicationException,它们会被Jersey Servlet捕获。