Springboot--全局统一异常处理+全局统一管理返回数据

这里是对全局的异常统一处理加上全局统一管理了返回数据
这两块单个的案例写在前面的博客
统一异常处理链接: https://blog.csdn.net/weixin_43606226/article/details/103781770
全局统一管理返回数据链接: https://blog.csdn.net/weixin_43606226/article/details/103782596


1.RetResult.java(自定义返回数据的结构类)
@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
public class RetResult<T> {
    private int code;
    private String msg;
    private T data;

    public RetResult(int code,String msg,T data){
        this.code=code;
        this.msg=msg;
        this.data=data;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

2.RetCode(枚举,一些常见状态)
public enum RetCode {
    // 成功
    SUCCESS(200),

    // 失败
    FAIL(202),

    // 未认证(签名错误)
    UNAUTHORIZED(401),

    // 接口不存在
    NOT_FOUND(404),

    // 服务器内部错误
    INTERNAL_SERVER_ERROR(500);

    public int code;

    RetCode(int code) {
        this.code = code;
    }
}

3.RetResponse.java(返回自定义的code,msg,data…等)
public class RetResponse {

    //自定义message 失败信息
    public static <T> RetResult<T> makeErrRsp(String message) {
        return new RetResult<T>(202,message,null);
    }

    //自定义code,msg 返回数据
    public static <T> RetResult<T> makeRsp(int code, String msg) {
        return new RetResult<T>(code,msg,null);
    }
    //自定义code,msg,data 返回数据
    public static <T> RetResult<T> makeRsp(int code, String msg, T data) {
        return new RetResult<T>(code,msg,data);
    }
}

4.RetException.java(返回的异常信息数据的结构类)
public class RetException {
    private int code;
    private String msg;
    private String url;

    public RetException(int code, String msg, String url) {
        this.code = code;
        this.msg = msg;
        this.url = url;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

5.RetResultAdvice.java(全局统一返回数据处理+异常处理类)
@RestControllerAdvice
public class RetResultAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        if (o instanceof RetResult) {
            return o;
        }
        //返回结果是String的时候需要做出处理,不然会报错
        if(o instanceof String) {
            return JSON.toJSONString(o);
        }
        //返回的数据若是异常返回信息,那么不做处理直接返回
        if(o instanceof RetException)
        {
            return o;
        }
        return new RetResult(200,"success" , o);
    }

    //先捕获异常 然后再把数据返回到ResponseBody中,然后在Body中要返回数据的时候调用上面的拦截方法beforeBodyWrite()
    @ExceptionHandler(value=Exception.class)
    public Object handleException(Exception e, HttpServletRequest request) {
        //此处返回json数据
        //捕捉到的异常如果是自定义异常类,那么就返回自定义异常类中的错误码和错误信息
        if (e instanceof MyException) {
            return new RetException(((MyException) e).getCode(), ((MyException) e).getMsg(), request.getRequestURL().toString());
        }
        //这里是除了自定义异常的其他异常信息
        else {
            return new RetException(100, e.getMessage(), request.getRequestURL().toString());
        }
    }
}

至此,统一异常处理和统一管理返回数据整合完成。
这样的话返回数据可以自定义一个成功code 还有一个失败code 或者其他code 来表示请求接口的时候,请求的状态是否成功,在接口中出现了异常也可以被全局异常管理捕获然后返回在请求接口得到的数据中。


测试
自定义异常测试:

  	@RequestMapping("/myexception")
    @ResponseBody
    public void myexception(){
        Random random=new Random();
        int i=random.nextInt(10);
        if(i==2){
            return;
        }else {
            throw new MyException(204, "抛出了自定义异常");
        }
    }

结果:
在这里插入图片描述

带数据返回结果测试:

 	@RequestMapping(value = "/select/{openid}",method = RequestMethod.GET)
    @ResponseBody
    public User searchUser(@PathVariable String openid)
    {
        User user=userService.selectByOpenid(openid);
        return user;
    }

结果:

在这里插入图片描述
测试返回数据 自定义code,msg

  	@RequestMapping("/test")
    @ResponseBody
    public RetResult test(){
        Random random=new Random();
        int i=random.nextInt(10);
        return RetResponse.makeRsp(208,"自定义msg");
    }

结果:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot提供了一种简洁而强大的方式来统一处理异常,特别是针对500错误。在Spring Boot中,我们可以使用@ControllerAdvice注解和@ExceptionHandler注解来实现统一异常处理。 首先,我们需要在应用程序的配置类上使用@ControllerAdvice注解来声明一个全局异常处理类。然后,在这个类中,我们可以使用@ExceptionHandler注解来定义处理特定异常的方法。 比如,对于500错误,我们可以创建一个方法来处理InternalServerErrorException异常。在方法中,我们可以返回一个自定义的错误页面或者错误信息,以便更友好地向用户展示异常信息。 下面是一个简单的示例代码: ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(InternalServerErrorException.class) public ModelAndView handleInternalServerErrorException(InternalServerErrorException ex) { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("error/500"); modelAndView.addObject("errorMessage", "服务器内部错误,请稍后再试!"); return modelAndView; } } ``` 在以上代码中,我们使用了ModelAndView来实现页面跳转,可以根据具体需求选择返回页面或者返回JSON数据。 另外,对于500错误,我们还可以通过自定义异常类来标识这种类型的异常,并在Controller方法中抛出该异常。然后,在全局异常处理类中捕获并处理这个异常。 综上所述,Spring Boot提供了一种简单而强大的方式来统一处理500错误,使我们能够更好地处理和展示异常信息,提升用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值