统一返回包装类 Result和异常处理

统一返回包装类 Result

包装类: 作用是统一后端返回的数据类型, code是作为前端判断请求成功的依据,msg是错误的信息, data是返回给前端的数据.
common/Result,java
复制代码
package com.longchi.common;

public class Result {
    private String code;
    private Object data;
    private String msg;

    // 不携带参数 成功时有可能不返回数据 定义一个success
    public static Result success() {
        Result result = new Result();
        result.setCode("200");
        result.setMsg("请求成功");
        return result;
    }

    // 携带参数 成功时返回数据 定义一个success
    public static Result success(Object data) {
        Result result = new Result();
        result.setCode("200");
        result.setData(data);
        result.setMsg("请求成功");
        return result;
    }

    // 定义统一的code(比如code为500),返回msg
    public static Result errror(String msg) {
        Result result = new Result();
        result.setCode("500");
        result.setMsg(msg);
        return result;
    }

    // 自定义code参数 传两个参数,比如code是400,或者401,500等等,返回msg
    public static Result errror(String code, String msg) {
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }

    public String getCode() {
        return code;
    }

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

    public Object getData() {
        return data;
    }

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

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}
学会看网络请求
按F12或者在页面右键,点击'检查'就可以看到控制台了

全局异常处理

在 longchi目录下创建 exception 包,在 exception 目录下创建
GlobalExceptionHandler.java 文件
复制代码
package com.longchi.exception;

/*
  全局的异常捕获器
  */

import com.longchi.common.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

// 要标注在类上,表示当前类是一个全局异常处理器的类
@ControllerAdvice("com.longchi.controller")
public class GlobalExceptionHandler {
    // 配置一个log
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(Exception.class)
    @ResponseBody    // 将result对象转换成json格式 返回json串
    public Result error(Exception e) {
        log.error("系统异常", e);
        return Result.errror("系统异常");
    }

    @ExceptionHandler(CustomerException.class)
    @ResponseBody    // 将result对象转换成json格式 返回json串
    public Result CustomerError(CustomerException e) {
        log.error("自定义错误", e);
        return Result.errror(e.getCode(), e.getMsg());
    }
}
有了全局异常捕获器,重新启动系统,就会抛出如下 '系统异常'
第一种 一般 自定义异常
在 exception 目录下创建 CustomerException.java 文件
复制代码
package com.longchi.exception;

/**
 * 自定义异常处理
 * 编译时不会报错,只有在运行时报错
 * 运行时异常
 */
public class CustomerException extends RuntimeException {
    private String code;
    private String msg;

    // 构造器 (有两个参数)
    public CustomerException(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    // 构造器 (有一个参数)
    public CustomerException(String msg) {
        this.code = "500";
        this.msg = msg;
    }

    public CustomerException() {
        //
    }

    public String getCode() {
        return code;
    }

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

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}
编辑时可以通过,运行时出错误
500错误: 常见的系统的错误, 抛出这些错误非常不友好,我们应该使用统一的处理方式
系统异常怎么办?
你得看你的控制台,然后找到报错的代码位置,具体地去修正代码
第一个红色框 打印系统异常 第二个红色框 具体的异常位置
此时浏览器返回数据
第二种 自定义异常
有时候前端传了账号密码过来,账号密码错了,我们如何去告诉前端你的账户密码错了。此时就需要自定义异常来处理此种情况。我们对外抛出一个错误,可能在service层,它不在controller层。在 service 层我们不能直接 Result,Result是在controller层包装的,想在别的层抛出错误,该如何处理?
1, 创建 service 文件夹 ,在 该目录下 创建 AdminService.java 文件,代码如下:
复制代码
package com.longchi.service;

import com.longchi.entity.Admin;
import com.longchi.exception.CustomerException;
import com.longchi.mapper.AdminMapper;
import org.springframework.stereotype.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import javax.annotation.Resource;
import java.util.List;

@Service
public class AdminService {

    @Resource
    AdminMapper adminMapper;

    public String admin(String name) {
        if ("admin".equals(name)) {
            return "admin";
        } else {
            throw new CustomerException("账号错误");
        }
    }

    public List<Admin> selectAll() {
        return adminMapper.selectAll();
    }

//    public PageInfo<Admin> selectPage(Integer pageNum, Integer pageSize) {
//        // 开启分页查询
//        PageHelper.startPage(pageNum,pageSize);
//        List<Admin> adminList = adminMapper.selectAll();
//        return PageInfo.of(adminList);
//    }
}
2, 去 WebController.java 添加相关代码
复制代码
// 表示这是一个get请求的接口
@GetMapping("/admin")
public Result admin(String name) {
    String admin = adminService.admin(name);
    return Result.success(admin);
}


完整代码如下
package com.longchi.controller;

import com.longchi.common.Result;
import com.longchi.service.AdminService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class WebController {

    // 注入 Service
    @Resource
    AdminService adminService;

    // 表示这是一个get请求的接口
    @GetMapping("/hello")    // 接口的路径 路由名和路径是全局唯一的
    public Result hello() {
        // int a = 1/0;
        return Result.success("hello王哥哥");
        // HashMap<Object, Object> map = new HashMap<>();
        // map.put("name", "青哥哥");
        // return Result.success(map);
    }

    // 表示这是一个get请求的接口
    @GetMapping("/admin")
    public Result admin(String name) {
        String admin = adminService.admin(name);
        return Result.success(admin);
    }
}
3, 去创建一个自定义异常CustomerException.java文件
复制代码
package com.longchi.exception;

/**
 * 自定义异常处理
 * 编译时不会报错,只有在运行时报错
 * 运行时异常
 */
public class CustomerException extends RuntimeException {
    private String code;
    private String msg;

    // 构造器 (有两个参数)
    public CustomerException(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    // 构造器 (有一个参数)
    public CustomerException(String msg) {
        this.code = "500";
        this.msg = msg;
    }

    public CustomerException() {
        //
    }

    public String getCode() {
        return code;
    }

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

    public String getMsg() {
        return msg;
    }

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

构造器使用方法

1, 按 alt+insert 快捷键 ,选择 'Constructor' 构造器
2, 点击 'Constructor' 构造器
3, 按住 shift 键,全选中
4, 点击 'OK' 生成如下代码
复制代码
public CustomerException(String code, String msg) {
    this.code = code;
    this.msg = msg;
}
重启目录,
访问 http://localhost/admin?admin=111
如何实现访问 WebController->AdminService.java(按住ctrl点击admin方法进入)
相关推荐
saadiya~2 小时前
从插件冗余到极致流畅:我的 Vue 3 开发环境“瘦身”实录
前端·javascript·vue.js
Mem0rin2 小时前
[Java/数据结构]顺序表之ArrayList
java·开发语言·数据结构
WarrenMondeville2 小时前
4.Unity面向对象-接口隔离原则
java·unity·接口隔离原则
zb200641202 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
啥咕啦呛2 小时前
java打卡学习3:ArrayList扩容机制
java·python·学习
Timer@2 小时前
LangChain 教程 03|快速开始:10 分钟创建第一个 Agent
前端·javascript·langchain
rrrjqy2 小时前
Java基础篇(二)
java·开发语言
亿元程序员2 小时前
十年游戏程序员开箱实测:这台显示器,彻底改写了我的游戏开发日常
前端
凉城a2 小时前
前端性能优化解决方案
前端·性能优化