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

时间:2016-03-08 13:46:27

标签: java rest exception jersey throw

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

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

每个案例是否有任何特定的例外,例如 InvalidParameterException 等等?是否有任何文档可以了解应该在哪些情况下抛出哪些异常?

3 个答案:

答案 0 :(得分:4)

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

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

投掷WebApplicationException

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

我认为抛出BadRequestException对你问题中提到的所有情况都没问题。请记住添加一条详细的消息来解释错误。

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

有关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

答案 1 :(得分:1)

所有3个错误听起来像客户端错误,因为客户端未能遵守合同 - 所以我会返回 HTTP 400错误请求 - 可能在响应正文中有解释。< / p>

答案 2 :(得分:0)

我相信通常你会根据你想要处理这些错误的方式创建单独的案例。例如,您将有3个不同的例外来表示您的错误。

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

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

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

要阅读有关异常映射器的信息,例如在jersey的帮助下:

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

那么你的问题: 不,我不相信在您的应用程序中抛出异常的最佳做法。通常,REST框架除了将返回500(内部服务器错误)的全能映射器之外,没有特定的异常映射器

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

我希望有所帮助,

阿图尔