Java 对api的异常处理和错误响应

Java 对api的异常处理和错误响应,java,api,exception,httpresponse,Java,Api,Exception,Httpresponse,我正在设计一个api的异常处理和错误响应。 有人能告诉我这些异常是如何为企业应用程序设计的吗。 我们可以将java预定义异常映射到应用程序异常吗。如果是这样,我们如何将预定义的java异常映射到我们的应用程序场景?如果没有,我们需要如何为企业应用程序设计异常?有什么指导方针吗? 一旦异常被映射,它就被赋予服务层。错误消息(用于api响应)是否应该在服务层中设置框架?如果是,您能说明原因吗?如果没有,您能否为任何api的帧错误响应指定任何其他选项? 您可以推荐应用程序中遵循的任何设计技巧吗? 提前

我正在设计一个api的异常处理和错误响应。 有人能告诉我这些异常是如何为企业应用程序设计的吗。 我们可以将java预定义异常映射到应用程序异常吗。如果是这样,我们如何将预定义的java异常映射到我们的应用程序场景?如果没有,我们需要如何为企业应用程序设计异常?有什么指导方针吗? 一旦异常被映射,它就被赋予服务层。错误消息(用于api响应)是否应该在服务层中设置框架?如果是,您能说明原因吗?如果没有,您能否为任何api的帧错误响应指定任何其他选项? 您可以推荐应用程序中遵循的任何设计技巧吗?
提前感谢

所以您只需使用@ControllerAdvice或@RestControllerAdvice编写全局异常处理程序,然后编写异常处理程序。您可以将内置异常映射到异常处理程序。因此,如果出现这些异常,则会执行异常处理程序的代码。我们可以提供自定义错误让客户了解出了什么问题

下面是我为处理RESTAPI异常而开发的代码片段。 因此,在我的代码中,我处理了两个异常NoTouchElementException和MethodArgumentNotValid异常

就我而言 若您按id搜索记录,若该记录不存在,您将得到NoTouchElementException,这样客户机将知道该记录不存在该id

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

@控制器建议

公共类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);
   }
@ExceptionHandler(NoSuchElementException.class)
公共最终响应标题HandlerecordNotFoundException(NoSuchElementException,例如WebRequest请求)
{
返回handleExceptionInternal(例如,ErrorResponse.builder()
.status(未找到HttpStatus.NOT_)
.时间戳(新日期())
.detail(例如getLocalizedMessage())
.消息(“未找到记录”)
.build(),new-HttpHeaders(),HttpStatus.NOT_FOUND,request);
}   
@凌驾
受保护的ResponseEntity handleMethodArgumentNotValid无效(MethodArgumentNotValidException ex、HttpHeaders标头、HttpStatus状态、WebRequest请求)
{
列表错误=新建ArrayList();
对于(ObjectError错误:例如getBindingResult().getFieldErrors())
{
errors.add(error.getObjectName()+“:”error.getDefaultMessage());
}   
返回handleExceptionInternal(例如,ErrorResponse.builder().details(errors).build,headers,HttpStatus.BAD_请求,请求);
}
}