在REST-API中抛出缺少id的异常

时间:2014-10-25 18:20:44

标签: java spring rest java-ee

我正在按照RESTful原则创建一个Web服务API。在服务层中,我有一个名为:

的方法
/**
 * @param answerId Id of the answer that will be deleted.
 */
void deleteAnswer(int answerId);

正如您所料,如果在系统中找到答案的ID,则会删除答案。现在,我的问题是:

在Web服务中使用此端点:

HTTP DELETE /my-context/answers/{answerId}

API的用户可以添加他们想要的任何ID。他们不应该,但他们能够。因此,我想从我解析HTTP消息的服务层抛出IllegalArgumentException(Spring Web负责这一点)。我的另一个选择是更改服务层中deleteAnswer方法的返回类型,以便返回true/false。你怎么看?

3 个答案:

答案 0 :(得分:0)

如果返回true,则表示您正在返回HTTP 200.虽然您应该返回404.Spring有异常处理程序控制器。您可以抛出自定义异常并定义一个异常处理程序,它将发送404正确的错误消息。

答案 1 :(得分:0)

返回异常意味着像这样调用你的方法是错误的。返回true / false意味着像这样调用您的服务api是合法的。 因为你说'#34;他们不应该"我会去寻求例外。

我宁愿使用我自己的异常类,它可以比IllegalArgumentException更清晰地处理。

答案 2 :(得分:0)

您的网络服务应通过指定适当的状态代码(例如400或404)来发出错误信号 您的Web服务签名将是:

ResponseEntity<Void> deleteAnswer(@PathVariable("answerId") int answerId);

你可以从服务层抛出异常,这绝对没问题。
然后你可以在你的'deleteAnswer'方法中捕获它并返回一个适当的状态代码。

或者(并且更好),您可以使用

处理来自一个地方的所有控制器的所有异常
@ControllerAdvice class YourExceptionResolver {
     @ExceptionHandler
     public ResponseEntity<String> defaultErrorHandler(HttpServletRequest req, Exception e) {
         //return status code 400, 404, or 500 based on the exception 
         //with String containing the error message
     }
 }

如果您使用来自服务层的@ControllerAdvice和异常,您可以保留原始签名'void deleteAnswer(int answerId)'。