【问题标题】:Exception for REST services for invalid input requests无效输入请求的 REST 服务例外
【发布时间】:2016-03-08 13:46:27
【问题描述】:

我目前正在开发REST 服务并为以下所有内容抛出BadRequestException

1. Path parameter is invalid
2. Query parameter is invalid
4. Input request object has missing attributes 

对于每种情况是否有任何特定的例外情况,例如 InvalidParameterException 等等..?是否有任何文档可用于了解在什么情况下应该抛出哪些异常?

【问题讨论】:

  • Rest 客户端抛出异常。你用过 spring RestTemplate 之类的库吗?

标签: java rest exception jersey throw


【解决方案1】:

我认为这是个人决定,答案将取决于您是否需要更详细的例外。

使用 JAX-RS 处理错误有两种方法:

抛出一个WebApplicationException

这就是您使用的方法,它允许您将扩展 WebApplicationException 的异常映射到 HTTP 错误响应。

我认为抛出BadRequestException 对于您问题中提到的所有情况都很好。请记住添加一条详细的消息来解释问题所在。

如果您需要更具体的例外,您可以考虑扩展BadRequestExceptionClientErrorException。新的异常可以封装解释请求问题的消息。这取决于您的需求。

有关 JAX-RS API 提供的异常的更多详细信息,请查看javax.ws.rs package documentation。如果它们不符合您的需求,只需扩展它们并创建您的特定例外。

使用ExceptionMapper

在其他情况下,抛出WebApplicationException 的实例或扩展WebApplicationException 的类可能不合适,相反,最好将现有异常映射到响应。对于这种情况,可以使用自定义异常映射提供程序。

考虑一下,例如,当您收到不适当的查询或路径参数值时,您决定抛出 IllegalArgumentException。您可以创建一个ExceptionMapper 以将IllegalArgumentException 映射到具有400 状态代码的响应:

@Provider
public class IllegalArgumentExceptionMapper 
             implements ExceptionMapper<IllegalArgumentException> {

    @Override
    public Response toResponse(IllegalArgumentException exception) {
        return Response.status(400).entity(exception.getMessage())
                       .type("text/plain").build();
    }
}

更多详情,请查看球衣documentation

【讨论】:

    【解决方案2】:

    所有 3 个错误听起来都像是客户端错误,因为客户端未能遵守合同 - 所以我会返回 HTTP 400 Bad Request - 可能在响应正文中附有解释。

    【讨论】:

      【解决方案3】:

      我相信您通常会根据您希望如何处理这些错误来创建单独的案例。例如,您将有 3 个不同的异常来表示您的错误。

      大多数框架都允许您安装 ExceptionMappers。这些将您的异常映射到 HTTP 响应代码。这些已记录在案,您应该遵循它们:

      例如:http://www.restapitutorial.com/httpstatuscodes.html

      例如,在您的情况下,我会为所有这 3 种情况抛出 IllegalArgumentExceptions 并安装一个映射器,将其映射到可能包含一些信息的 400 响应代码。 例如,这可能很重要,因为使用您的服务的客户端无论如何都不会收到您的异常,而是分析请求的响应代码。使用 400,用户将知道该请求无效并且不会重试。你可以有各种各样的类似案例。

      要了解异常映射器,例如在 jersey 的帮助下:

      https://jersey.java.net/documentation/latest/representations.html

      所以对于你的问题: 不,我不相信关于从您的应用程序中抛出什么异常的最佳实践。通常 REST 框架没有特定的异常映射器,除了一个会返回 500(内部服务器错误)的包罗万象的映射器

      但是,对于 REST 和 HTTP,有关于应针对特定用例返回哪些响应的文档。您应该尝试设计您的 REST 端点以符合这些标准,以获得最大的可重用性和可理解性。

      希望对你有帮助

      阿图尔

      【讨论】:

        猜你喜欢
        • 2020-04-27
        • 2015-05-22
        • 1970-01-01
        • 2016-01-18
        • 1970-01-01
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多