无效输入请求的 REST 服务异常

Exception for REST services for invalid input requests

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

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

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

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

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

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

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

阅读异常映射器,例如在球衣的帮助下:

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

所以对于你的问题: 不,我认为没有关于从您的应用程序中抛出哪些异常的最佳实践。通常 REST 框架没有特定的异常映射器,除了会 return 500(内部服务器错误)

的全能映射器

然而,对于特定用例应 return 编辑 REST 和 HTTP 的文档。您应该尝试设计您的 REST 端点以符合这些标准,以实现最大的可重用性和可理解性。

希望对你有所帮助,

阿图尔

所有 3 个错误听起来都像是客户端错误,因为客户端未能遵守合同 - 所以我会 return HTTP 400 Bad Request - 也许有一个回复正文中的解释。

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

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

投掷 WebApplicationException

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

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

如果您需要更具体的例外,您可以考虑扩展 BadRequestException 或者 ClientErrorException。新的异常可以封装解释请求问题的消息。就看你的需求了。

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

使用 ExceptionMapper

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

例如,考虑一下,您决定将 IllegalArgumentException whenever you received an inapropriate value for your query or path parameters. You can create an ExceptionMapper to map the 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