在 JAX-RS 中调用自定义 ExceptionMapper

Aig*_*guo 1 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();
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,在我的资源类中,我有一个 try 和一个 catch 块。如果有异常,catch 块应该捕获它并调用自定义异常映射器类。抛出异常的常用方法如下:

 catch (Exception e) {
    throw new WebApplicationException(Response.status(Status.INTERNAL_SERVER_ERROR).entity("Internal Server Error").build());
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试通过以下方式调用异常映射器类:

catch (Exception e) {
    exceptionMapper.toResponse(e);
}
Run Code Online (Sandbox Code Playgroud)

exceptionMapper类的字段在哪里ServiceExceptionMapper

cas*_*lin 5

有什么ExceptionMapper用?

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

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

and 背后的想法ExceptionMapper是将被抛出的an映射ExceptionResponse. 检查ExceptionMapper#toResponse(E)方法签名,您将看到它接收扩展Throwable并且必须返回一个Response. 这种方法由 JAX-RS 运行时调用。

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

使用 JAX-RS 查找提供者

如果您需要对提供者实例(ExceptionMappers 是提供者)执行运行时查找,您可以使用Providers可注入接口。使用@Context注解将其注入到您的资源类中:

@Context
private Providers providers;
Run Code Online (Sandbox Code Playgroud)

然后你可以得到ExceptionMapper一个特定类别的异常:

ExceptionMapper<Throwable> exceptionMapper = providers.getExceptionMapper(Throwable.class);
Run Code Online (Sandbox Code Playgroud)

注1:其他可以注入@Context注解的类型,参考这个回答

注2:Providers接口API允许你查找以下供应商: