Jersey:如何注册省略某些子类的ExceptionMapper?

时间:2012-12-05 05:20:49

标签: jersey jax-rs

如何注册为泽西岛提供特殊处理的拦截ExceptionMapper<Exception>的全部WebApplicationException

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

3 个答案:

答案 0 :(得分:8)

我最终注册了一个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);
    }
}

答案 1 :(得分:1)

看看它是如何在ReXSL ExceptionTrap课程中完成的。您没有注册ExceptionMapper来捕获泽西未捕获的所有异常。相反,你让它们冒泡到Servlet容器(例如Tomcat),容器会将它们转发到正确的servlet以便进一步处理。

ExceptionMapper的主要目的是将某些特定于业务的异常转换为HTTP响应。换句话说,让应用程序控制特殊的事件流。另一方面,servlet异常捕获机制的目的是控制应用程序故障转移并执行一些事后操作,例如,日志记录。换句话说,ExceptionMapper在您仍处于控制状态时起作用,而异常捕获servlet在控制丢失时有帮助,您必须向用户显示50x响应代码。

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

答案 2 :(得分:0)

扩展ExtendedExceptionMapper并实施isMappable(e)

@Override
public boolean isMappable(T e) {
    return !e instanceof WebApplicationException;
}