[英]Calling a custom ExceptionMapper in JAX-RS
我创建了一个自定义ExceptionMapper
,每次在API中发生异常时都希望调用它,以将其映射到合适的响应。 以下是我的自定义异常类:
@Provider
public class ServiceExceptionMapper implements ExceptionMapper<Throwable> {
private Logger logging = LoggerFactory.getLogger(getClass());
@Override
public Response toResponse(Throwable throwable) {
log.error("There is an exception: ", throwable);
if (throwable instanceof IllegalArgumentException) {
return Response.status(Response.Status.BAD_REQUEST).entity(throwable.getMessage()).type (MediaType.TEXT_PLAIN).build();
}
if (throwable instanceof WebApplicationException) {
WebApplicationException we = (WebApplicationException) throwable;
return we.getResponse();
}
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(throwable.getMessage()).type(MediaType.TEXT_PLAIN).build();
}
}
现在,在资源类中,我有一个try和catch块。 如果存在异常,catch块应该捕获它并调用自定义异常映射器类。 引发异常的常用方法如下:
catch (Exception e) {
throw new WebApplicationException(Response.status(Status.INTERNAL_SERVER_ERROR).entity("Internal Server Error").build());
}
我试图通过以下方式调用异常映射器类:
catch (Exception e) {
exceptionMapper.toResponse(e);
}
其中exceptionMapper
是ServiceExceptionMapper
类的字段。
ExceptionMapper
的作用是什么? 但是,如何调用自定义异常映射器类以引发相同的异常呢?
我希望自定义异常映射器类负责抛出API中发生的异常。 因此,我不想直接引发异常(我的第二个代码段),而是要调用异常映射器类并希望它引发该异常。
ExceptionMapper
和ExceptionMapper
的思想是将抛出的Exception
映射到Response
。 检查ExceptionMapper#toResponse(E)
方法签名,您会看到它收到了一些扩展Throwable
东西,并且必须返回Response
。 这种方法由JAX-RS运行时调用。
如果由于某种原因,您不想直接在资源方法代码中引发异常,则可以考虑创建一个实用程序类来执行此操作,然后可以调用其方法来实例化并引发异常。 然后ExceptionMapper
会将已引发的ExceptionMapper
映射到HTTP响应。
如果需要执行提供程序实例的运行时查找( ExceptionMapper
是提供程序),则可以使用Providers
可注入接口。 使用@Context
批注将其注入资源类中:
@Context
private Providers providers;
然后,您可以为特定的异常类获取ExceptionMapper
:
ExceptionMapper<Throwable> exceptionMapper = providers.getExceptionMapper(Throwable.class);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.