检查控制器中的业务逻辑以提供更好的错误消息

Sha*_*ane 1 java spring spring-mvc spring-boot

我有一个返回UserDto对象的服务方法.但是,在某些情况下,对控制器的请求将返回除200以外的HTTP状态,但服务只能返回null或者UserDto.

将一些业务逻辑移动到控制器并直接调用存储库以返回更详细的错误消息是不好的做法,因为服务无法将错误消息传递回控制器?

Eri*_*agt 5

通过使服务抛出业务异常,您可以做得更好,并且控制器会对此做出反应.例如,CustomerService可能抛出一个`CustomerNotFoundException',控制器可以将其转换为适当的HTTP状态代码,如下所示:

@ExceptionHandler({ CustomerNotFoundException.class })
public ResponseEntity handleException(CustomerNotFoundException ex, WebRequest request) {
    ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), request.getDescription(false));
    return new ResponseEntity<>(errorDetails, HttpStatus.NOT_FOUND);
}
Run Code Online (Sandbox Code Playgroud)

我建议不要将业务逻辑移动到控制器,因为控制器更像是基础架构组件而不是域逻辑.另外,请考虑添加另一个协议,例如二进制协议,它不会使用控制器层.您可能会错过验证或业务规则.