我有一个场景:
UI<--->Spring boot micro-service REST API<--->server
现在,我希望处理自定义异常(我知道该怎么做)以便在服务器以某种方式响应时将特定的Http状态和消息返回给UI。 500应返回&#34;请在一段时间后返回&#34;内部服务器错误&#34;内部服务器错误&#34;。我们的微服务的maven项目分为3层(子maven项目),即Business,Web和Domain。其中web包含控制器类,Business包含Service类,Domain包含@ Entity,@ Component等。
我想知道为了处理上面提到的异常让我们说HTTP Status 500,应该在业务层完成吗?或者在网络层即控制器级别。什么是最好的解决方案? (我知道ResponseEntity以及它如何为UI提供自定义响应。)
我个人认为,如果我在Business Level中包含自定义异常类,并在检查响应状态后使用响应实体在Controller类中返回该异常类就可以了。但官员认为应该在服务水平上完成?我无法理解为什么(它使过程更复杂)?谁能建议哪种解决方案最好?
答案 0 :(得分:3)
如果要在全局级别处理错误,可以使用@ControllerAdvice,这在处理自定义异常以及运行时异常时非常容易。
您可以将业务层中的异常抛出到Web控制器,并定义@ControllerAdvice类以捕获这些错误并提供具有正确响应状态的响应。
对于Ex: -
@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = { IllegalArgumentException.class, IllegalStateException.class })
protected ResponseEntity<Object> handleConflict(RuntimeException ex, WebRequest request) {
String bodyOfResponse = "This should be application specific";
return handleExceptionInternal(ex, bodyOfResponse,
new HttpHeaders(), HttpStatus.CONFLICT, request);
}
}
并从控制器类中抛出那些Exception类,你不需要从控制器中捕获异常。
希望这对你有帮助......
我从here
获取的代码信息答案 1 :(得分:2)
官员是对的,它应该在服务层。我会说最好的做法是使用@ExceptionHandler。由于在控制器方法中处理异常的缺点是它使代码的可读性降低,并且可能会在许多控制器方法中重复。
我建议为控制器安装一个基类,并定义@ExceptionHandler。这样它就可以用于许多不同的控制器,而不需要任何代码重复。这比异常解析器方法更具可读性,但可以结合使用 这清楚地解释了here
答案 2 :(得分:0)
错误响应通常由匹配您的例外类型的@ExceptionHandler
生成,并且可能已按here所述的@ConrtrollerAdvice
注册。
API应该标准化(例如http://jsonapi.org/),主要是为开发人员设计的。返回&#34;请稍后返回&#34;而不是&#34;内部服务器错误&#34;对我来说没什么意义。它是一个不确定原因的500 HTTP状态响应,例如NullPointerException
代码深处的某个地方。