从来好事天生俭,自古瓜儿苦后甜。这篇文章主要讲述Jersey:如何注册省略某些子类的ExceptionMapper?相关的知识,希望能为你提供帮助。
我如何注册一个全面的ExceptionMapper<
Exception>
,它不拦截泽西提供特殊处理的WebApplicationException
?
更新:我提交了此功能请求:http://java.net/jira/browse/JERSEY-1607
答案我最终注册了一个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);
}
}
另一答案看看它是如何在ReXSL ExceptionTrap课程中完成的。你没有注册一个
ExceptionMapper
来捕捉泽西没有抓到的所有异常。相反,您让它们冒泡到Servlet容器(例如Tomcat),容器会将它们转发到正确的servlet以进行进一步处理。ExceptionMapper
的主要目的是将某些特定于业务的异常转换为HTTP响应。换句话说,让应用程序控制特殊的事件流。另一方面,servlet异常捕获机制的目的是控制应用程序故障转移并执行一些事后操作,例如,日志记录。换句话说,ExceptionMapper
在您仍处于控制状态时起作用,而异常捕获servlet在控制丢失时有帮助,您必须向用户显示50x
响应代码。如果封装的
WebApplicationException
的状态代码高于500,则Jetty记录(通过JUL)每个Response
。Jetty不记录运行时异常,它们只是冒泡到容器。另一答案【Jersey(如何注册省略某些子类的ExceptionMapper())】扩展ExtendedExceptionMapper并实施
isMappable(e)
:@Override
public boolean isMappable(T e) {
return !e instanceof WebApplicationException;
}
推荐阅读
- 在ExceptionMapper中注入单例
- 在Jersey webapp中运行Angular2应用程序
- Jersey ExceptionMapper未被调用
- 找不到模块(无法解析'./AppRoutes')
- 将Redux SubApp与React Router配合使用
- 在android中获取位置地址时出错
- 接收广播Intent时出错{act = android.location.PROVIDERS_CHANGED flg = 0x10}
- 获取当前lat长的android
- 经度和纬度GPSTracker Android总是返回0,0