映射 WebApplicationExceptions

Mapping WebApplicationExceptions

我想知道 Javax-RS/Jersey ExceptionMapper class 在映射 WebApplicationExceptions

时的正确用途是什么

我喜欢以下简单的 3 状态范例:

WebApplicationExceptions 的问题在于它们可能是客户端(403,禁止访问)或服务器端(503 Bad Gateway);因此,它们可能会根据情况映射到 404 或 500。

我正在努力尝试检查 WebApplicationException 以便我可以确定它是客户端还是服务器端。

迄今为止我最好的尝试:

// Groovy pseudo-code
class MyMapper implements ExceptionMapper<Throwable> {
    @Override
    Response toResponse(Throwable error) {
        if(error instanceof WebApplicationException) {
            if(isClientSide(error as WebApplicationException)) {
                // Return HTTP 404.
            } else {
                // Return HTTP 500.
            }
        } else if(error instanceof ClientException) {
            // Return HTTP 404.
        } else if(error instanceof ServerException) {
            // Return HTTP 500.
        } else {
            // All other throwables. Default to HTTP 500.
        }
    }

    private boolean isClientSide(WebApplicationException webAppExc) {
        // TODO: How to make this determination?
    }
}

这里有几个concerns/issues:

WebApplicationExceptionExceptionMapper 的用途相似但略有不同。

它们都帮助开发人员设置自定义 HTTP 错误代码和对特定异常发生的响应。

WebApplicationException 主要用于自定义或用户定义的异常;这意味着每当您的应用程序抛出用户定义的异常时,您都可以设置您想要的 HTTP 响应代码以及问题的详细描述,还可以设置 return 类型。

看起来像这样:-

public class UserDefinedExcpetion extends WebApplicationException {

  /**
  * Create a HTTP 404 Not Found Error as plain text
  * whenever a UserDefinedExcpetion happens.
  */
  public UserDefinedExcpetion (String yourMessage) {
    super(Response.status(Responses.NOT_FOUND).
    entity(yourMessage).type("text/plain").build());
  }
}

您对应用程序中已经存在的异常(例如用户未定义的异常)使用 ExceptionMapper ,并且在发生这些异常时您希望发送自定义 HTTP 错误响应,其中嵌入了一些详细信息;并设置消息的类型。

这样使用:-

   @Provider
    public class IOExceptionMapper implements ExceptionMapper<java.io.IOException> {
      public Response toResponse(java.io.IOException) {
/** Mapper which maps to IOExcpetion and gets called automatically by the JAXRS runtime when this exception occurs. Throw a 404 when this exception occurs.**/
        return   Response.status(404).entity(ex.getMessage()).type("text/plain").build();
      }
    }

注意:- 请注意在 jaxrs 运行时注册此映射器的 @Provider 注释。