【问题标题】:Exception handling and error response to an api [closed]异常处理和对 api 的错误响应 [关闭]
【发布时间】:2020-07-09 19:48:50
【问题描述】:

我正在努力设计对 api 的异常处理和错误响应。 谁能让我知道如何为企业应用程序设计异常。 我们可以将 java 预定义的异常映射到应用程序异常吗?如果是这样,我们如何将预定义的 java 异常映射到我们的应用场景?如果没有,我们需要如何为企业应用程序设计异常?任何指导方针? 一旦异常被映射,它就被提供给服务层。错误消息(用于 api 响应)是否应该在服务层中框定?如果是,你能说明任何理由吗?如果不能,您可以指定任何其他选项来构建任何 api 的错误响应吗? 可以建议您的应用程序中遵循的任何设计技术吗? 提前致谢

【问题讨论】:

    标签: java api exception httpresponse


    【解决方案1】:

    所以您需要做的就是使用@ControllerAdvice 或@RestControllerAdvice 编写全局异常处理程序,然后编写异常处理程序。您可以将内置异常映射到异常处理程序。因此,如果出现这些异常,那么异常处理程序的代码将得到执行。并且我们可以提供自定义的错误消息,以便客户了解发生了什么问题。

    下面是我为处理rest api异常而开发的代码sn-p。 所以在我的代码中,我处理了两个异常 NoSuchElementException 和 MethodArgumentNotValid 异常。

    例如在我的情况下 如果您按 id 搜索记录并且如果该记录不存在,您将得到 NoSuchElementException 以便客户端知道该 id 的记录不存在

    对于 MethodArgumentNotValid 异常,我为变量添加了约束 例如,尝试输入负 id 会出现此异常

    @ControllerAdvice

    公共类 GlobalExceptionHandler 扩展 ResponseEntityExceptionHandler{

      @ExceptionHandler(NoSuchElementException.class)
     public final ResponseEntity<Object>handleRecordNotFoundException(NoSuchElementException ex,WebRequest request)
    {
        return handleExceptionInternal(ex,ErrorResponse.builder()
                           .status(HttpStatus.NOT_FOUND)
                           .timestamp(new Date())
                           .detail(ex.getLocalizedMessage())
                           .message("Record not found")
                           .build(),new HttpHeaders(),HttpStatus.NOT_FOUND,request);
    
    }   
    
        @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,HttpHeaders headers,HttpStatus status,WebRequest request)
    {
         List<String> errors=new ArrayList<String>();
         for(ObjectError error:ex.getBindingResult().getFieldErrors())
        {
                errors.add(error.getObjectName()+":"error.getDefaultMessage());
        }   
    
        return handleExceptionInternal(ex,ErrorResponse.builder().details(errors).build,headers,HttpStatus.BAD_REQUEST,request);
       }
    

    }

    【讨论】:

      猜你喜欢
      • 2020-01-04
      • 1970-01-01
      • 2021-04-23
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 2012-09-15
      相关资源
      最近更新 更多