我目前正在开发REST
服务,并为以下所有内容投放BadRequestException
,
1. Path parameter is invalid
2. Query parameter is invalid
4. Input request object has missing attributes
每个案例是否有任何特定的例外,例如 InvalidParameterException 等等?是否有任何文档可以了解应该在哪些情况下抛出哪些异常?
答案 0 :(得分:4)
我认为这是个人决定,答案取决于您是否需要更详细的说明。
使用JAX-RS处理错误有两种方法:
WebApplicationException
这就是您正在使用的方法,它允许您将扩展WebApplicationException
的异常映射到HTTP错误响应。
我认为抛出BadRequestException
对你问题中提到的所有情况都没问题。请记住添加一条详细的消息来解释错误。
如果您需要更具体的例外,可以考虑延长BadRequestException
或ClientErrorException
。新的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端点以符合这些标准,以实现最大的可重用性和可理解性。
我希望有所帮助,
阿图尔