5

如何注册一个ExceptionMapper<Exception>不拦截Jersey 提供特殊处理的包罗万象WebApplicationException

更新:我提交了这个功能请求:http: //java.net/jira/browse/JERSEY-1607

4

3 回答 3

10

我最终注册了一个 ExceptionMapper:

import com.google.inject.Singleton;
import com.sun.jersey.api.container.MappableContainerException;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

/**
 * @author Gili Tzabari
 */
@Provider
@Singleton
public class RuntimeExceptionMapper implements ExceptionMapper<RuntimeException>
{
    @Override
    public Response toResponse(RuntimeException e)
    {
        if (e instanceof WebApplicationException)
        {
            // WORKAROUND: Attempt to mirror Jersey's built-in behavior.
            // @see http://java.net/jira/browse/JERSEY-1607
            WebApplicationException webApplicationException = (WebApplicationException) e;
            return webApplicationException.getResponse();
        }
        // Jetty generates a log entry whenever an exception is thrown. If we don't register an
        // ExceptionMapper, Jersey will log the exception a second time.
        throw new MappableContainerException(e);
    }
}
于 2013-05-14T20:22:50.930 回答
1

看看它是如何在ReXSL ExceptionTrap类中完成的。您无需注册 anExceptionMapper即可捕获 Jersey 未捕获的所有异常。相反,您让它们冒泡到 Servlet 容器(例如 Tomcat),容器会将它们转发到正确的 servlet 以供进一步处理。

的主要和唯一目的ExceptionMapper是将某些特定于业务的异常转换为 HTTP 响应。换句话说,让应用程序控制异常的事件流。另一方面,servlet 异常捕获机制的目的是控制应用程序故障转移并执行一些事后操作,例如日志记录。换句话说,ExceptionMapper当您仍然处于控制之中时,它可以工作,而当您失去控制并且您必须向50x用户显示响应代码时,异常捕获 servlet 会有所帮助。

Jetty 记录(通过 JUL),WebApplicationException如果其封装Response的状态代码高于 500。Jetty 不会记录运行时异常,它们只是冒泡到容器中。

于 2012-12-05T07:44:11.767 回答
1

扩展ExtendedExceptionMapper并实现isMappable(e)

@Override
public boolean isMappable(T e) {
    return !e instanceof WebApplicationException;
}
于 2017-12-19T13:58:05.990 回答