我正在按照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
。你怎么看?
答案 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)'。