springboot全局返回数据封装及其全局异常

springboot全局返回数据封装及其全局异常

1、全局返回数据封装

1、首先先写一个数据返回结构

写一个请求成功返回类,也就是整体返回的数据结构,code、msg、data,然后再写一些列方法,供处理器调用,处理器调用返回的数据类型,就是自己定义的类型

例如:

{
"code": 1,
"msg": "SUCCESS",
"data": {
"hello": "hello"
}
}

自定义返回结构

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PlatformResult implements Serializable {
    /**
     * 自定义状态码
     */
    private Integer code;
    /**
     * 自定义消息
     */
    private String msg;
    /**
     * 返回数据
     */
    private Object data;

    private void setPlatformResult(ResultCodeEnum resultCodeEnum){
        this.code=resultCodeEnum.getCode();
        this.msg=resultCodeEnum.getMsg();
    }

    public PlatformResult success(){
        PlatformResult platformResult=new PlatformResult();
        platformResult.setPlatformResult(ResultCodeEnum.SUCCESS);
        return platformResult;
    }

    public static PlatformResult success(Object data){
        PlatformResult platformResult=new PlatformResult();
        platformResult.setPlatformResult(ResultCodeEnum.SUCCESS);
        platformResult.setData(data);
        return platformResult;
    }

    public static PlatformResult failure(ResultCodeEnum resultCodeEnum){
        PlatformResult platformResult=new PlatformResult();
        platformResult.setPlatformResult(ResultCodeEnum.Fail);
        return platformResult;
    }

    public static PlatformResult failure(ResultCodeEnum resultCodeEnum,Object data){
        PlatformResult platformResult=new PlatformResult();
        platformResult.setPlatformResult(ResultCodeEnum.Fail);
        platformResult.setData(data);
        return platformResult;
    }

2、封装数据处理器,全局返回数据

@RestControllerAdvice
public class ResponseResultHandler implements ResponseBodyAdvice<Object> {

    //判断方法有无返回类型,有则调用 beforeBodyWrite 方法
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        //判断方法的返回值
        return !returnType.getMethod().getReturnType().isAssignableFrom(Void.TYPE);
    }

    @Override
    public Object beforeBodyWrite(Object body
            , MethodParameter returnType
            , MediaType selectedContentType
            , Class<? extends HttpMessageConverter<?>> selectedConverterType
            , ServerHttpRequest request
            , ServerHttpResponse response) {

        if (body instanceof ErrorResult){
            return ErrorResult.failure((ErrorResult) body);
        }else{
            return PlatformResult.success(body);
        }
    }
}
2、全局处理异常

1、写一个异常处理类

自定义异常类返回结构体

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ErrorResult implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * HTTP响应状态码 {@link org.springframework.http.HttpStatus}
     */
    private Integer status;

    /**
     * 异常堆栈的精简信息
     *
     */
    private String message;

    /**
     *  错误状态码
     */
    private Integer code;

    /**
     * 异常的名字
     */
    private String exception;

    public static ErrorResult failure(ResultCodeEnum resultCodeEnum,Throwable e, HttpStatus httpStatus) {
        ErrorResult errorResult = new ErrorResult();
        errorResult.setCode(resultCodeEnum.getCode());
        errorResult.setMessage(resultCodeEnum.getMsg());
        errorResult.setStatus(httpStatus.value());
        errorResult.setException(e.getClass().getName());
        return errorResult;
    }

    public static ErrorResult failure(ErrorResult errorResult) {
        ErrorResult result = new ErrorResult();
        result.setCode(errorResult.getCode());
        result.setMessage(errorResult.getMessage());
        result.setStatus(errorResult.getStatus());
        return result;
    }

    public static ErrorResult failure(BusinessException e) {
        ErrorResult errorResult = ErrorResult
                .failure(e.getResultCodeEnum() == null ? ResultCodeEnum.SYSTEM_INNER_ERROR : e.getResultCodeEnum(),
                        e, HttpStatus.OK);
        errorResult.setMessage(e.getMessage());

        return errorResult;
    }
    
}

2、自定义异常类

自定义一个运行期异常,供自己抛出使用

@Data
public class BusinessException extends RuntimeException{
    protected String message;

    protected Integer code;

    protected ResultCodeEnum resultCodeEnum;


    public BusinessException() {
    }

    public BusinessException(String message) {
        this();
        this.message = message;
    }

    public BusinessException(ResultCodeEnum resultCodeEnum) {
        this.resultCodeEnum = resultCodeEnum;
        this.code = resultCodeEnum.getCode();
        this.message = resultCodeEnum.getMsg();
    }
}

3、全局异常处理

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    /**
            * 如果没有使用 @ResponseStatus 来注明状态,需要通过 throw new 来抛出异常
     * 处理通用自定义业务异常
     */
    //抛出自定义异常时,调用
    @ExceptionHandler(BusinessException.class)
    public ErrorResult handleBusinessException(BusinessException e, HttpServletRequest request) {
//        log.error("handleBusinessException start, uri:{}, exception:{}, caused by: {}"
//                , request.getRequestURI()
//                , e.getClass()
//                , e.getMessage() + e.getData());
        return ErrorResult.failure(e);
    }

    /**
     * 处理运行时系统异常(反500错误码)
     */
    //500异常时,抛出此异常
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(RuntimeException.class)
    public ErrorResult handleRuntimeException(RuntimeException e, HttpServletRequest request) {
        log.error("handleRuntimeException start, uri:{}, caused by: ", request.getRequestURI(), e);
        return ErrorResult.failure(ResultCodeEnum.SYSTEM_INNER_ERROR, e, HttpStatus.INTERNAL_SERVER_ERROR);
    }

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 中,可以通过实现一个全局异常处理器来捕获应用程序中的异常,并对异常进行统一处理。 实现一个全局异常处理器的步骤如下: 1. 创建一个异常处理器类,用于处理应用程序中的异常。 ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception ex) { ErrorResponse errorResponse = new ErrorResponse("500", ex.getMessage()); return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); } } ``` 2. 在异常处理器类上加上 @ControllerAdvice 注解,表示这是一个全局异常处理器。 3. 在异常处理器类中定义异常处理方法,使用 @ExceptionHandler 注解指定要处理的异常类型。在异常处理方法中,可以处理异常返回一个自定义的错误响应实体。 4. 在异常处理方法中使用 ResponseEntity 类来封装错误响应实体,并指定 HTTP 状态码。这里示例使用了 500 状态码。 5. 配置 Spring Boot 应用,使其能够扫描到异常处理器类。可以在启动类上加上 @ComponentScan 注解来指定扫描路径。 ```java @SpringBootApplication @ComponentScan(basePackages = "com.example.demo") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 以上就是在 Spring Boot 中实现全局异常处理的步骤。通过实现全局异常处理器,可以有效地统一处理应用程序中的异常

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值