在JAX-RS中调用自定义ExceptionMapper

时间:2017-01-25 15:30:56

标签: java 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的字段。

1 个答案:

答案 0 :(得分:4)

ExceptionMapper的内容是什么?

  

但是如何调用我的自定义异常映射器类来抛出相同的异常呢?

  

我希望自定义异常映射器类能够处理抛出API中发生的异常。因此,我不想直接抛出异常(我的第二个代码片段),而是想调用异常映射器类,并希望它抛出异常。

背后的想法ExceptionMapper映射已被投放到ExceptionResponse。检查ExceptionMapper#toResponse(E)方法签名,您会看到它收到的内容为Throwable,且必须返回Response。这种方法由JAX-RS运行时调用。

如果出于任何原因,您不想直接在资源方法代码中抛出异常,您可以考虑创建一个实用程序类来执行它,然后您可以调用其方法来实例化并抛出异常。然后ExceptionMapper会将抛出的异常映射到HTTP响应。

使用JAX-RS

查找提供程序

如果需要执行运行时查找提供程序实例(ExceptionMapper是提供程序),则可以使用Providers可注入接口。使用@Context注释将其注入资源类:

@Context
private Providers providers;

然后,您可以获得特定类别异常的ExceptionMapper

ExceptionMapper<Throwable> exceptionMapper = providers.getExceptionMapper(Throwable.class);

注1:对于可以使用@Context注释注入的其他类型,请参阅此answer

注2: Providers界面API可让您查找以下提供商: