繁体   English   中英

REST-API中缺少ID的抛出异常

[英]Throwing exception for missing id in REST-API

我正在按照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。 他们不应该,但是他们能够。 因此,我想从服务层抛出一个IllegalArgumentException来解析HTTP消息(Spring Web会解决此问题)。 我的另一个选择是更改服务层中deleteAnswer方法的返回类型,使其返回true/false 你怎么看?

如果返回true,则表示返回HTTP200。应该返回404。Spring具有异常处理程序控制器。 您可以抛出自定义异常并定义一个异常处理程序,该处理程序将发送404错误信息。

返回异常意味着这样调用您的方法是错误的。 返回true / false表示以这种方式调用服务api是合法的。 因为您说“他们不应该”,所以我会例外。

我宁愿使用自己的异常类,该类可以比IllegalArgumentException干净得多。

您的Web服务应通过指定适当的状态码(例如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)'。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM