前后端分离(springboot+vue)下的异常处理

前后端分离(springboot+vue)的业务异常处理

将业务异常处理为相应响应状态(meta.code),前端拦截后做出处理

一、后端异常处理

1、自定义异常类

继承自RuntimeException

public class ItokenException extends RuntimeException {


    private ItokenException(ExceptionData exceptionData) {
        super(exceptionData.getErrorMessage());
    }

    /**
     * 功能描述 异常枚举类抛出
     *
     * @return com.funtl.itoken.commons.exception.ItokenException
     * @author qyh
     * @date 2020/3/11
     */
    public static ItokenException buildException(ErrorCodeEnum errorCodeEnum) {
        ExceptionData exceptionData = new ExceptionData(errorCodeEnum.getCode(), errorCodeEnum.getMsg());
        return new ItokenException(exceptionData);
    }

    /**
     * 功能描述 异常枚举类加自定义信息
     *
     * @return com.funtl.itoken.commons.exception.ItokenException
     * @author qyh
     * @date 2020/3/11
     */
    public static ItokenException buildException(ErrorCodeEnum errorCodeEnum, String msg) {

        ExceptionData data = null;
        if (StringUtils.isEmpty(msg)) {
            data = new ExceptionData(errorCodeEnum.getCode(), errorCodeEnum.getMsg());
        } else {
            data = new ExceptionData(errorCodeEnum.getCode(), errorCodeEnum.getMsg() + msg);
        }

        return new ItokenException(data);
    }
}

2、自定义异常类型枚举

public enum ErrorCodeEnum {

    // 基础错误异常
    ERROR(-1, "错误异常"),
    SYSTEM_ERROR(0, "系统错误"),
    INVALID_PARAMS(1, "非法参数"),
    PROC_FAILED(2, "处理失败"),
    DATA_NOT_FOUND(3, "数据不存在"),
    DATA_EMPTY(4, "数据为空"),
    ;

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

    /**
     * 错误信息
     */
    private String msg;

    ErrorCodeEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

3、自定义接口返回信息

包含meta(请求状态及信息)、data(响应数据)

public class ResponseResult<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 响应状态
     */
    private ResponseCodeMessage meta;

    /**
     * 响应数据
     */
    private T data;


    /**
     * 功能描述 响应构造器
     *
     * @param code 响应码
     * @param msg  响应消息
     * @param data 响应数据
     * @return
     * @author qyh
     * @date 2020/3/29
     */
    public ResponseResult(Integer code, String msg, T data) {
        this.meta = new ResponseCodeMessage(code, msg);
        this.data = data;
    }

    /**
     * 功能描述 失败的响应
     *
     * @param
     * @return com.funtl.itoken.commons.response.ResponseResult<T>
     * @author qyh
     * @date 2020/3/29
     */
    public static <T> ResponseResult<T> fail() {
        return new ResponseResult<>(ResponseCodeMessageEnum.UNKNOWN_ERROR.getCode(),
                ResponseCodeMessageEnum.UNKNOWN_ERROR.getMsg(), (T) null);
    }

    /**
     * 功能描述 自定义状态
     *
     * @param
     * @return com.funtl.itoken.commons.response.ResponseResult<T>
     * @author qyh
     * @date 2020/3/29
     */
    public static <T> ResponseResult<T> custom(Integer code, String msg, T data) {
        return new ResponseResult<>(code, msg, data);
    }

    /**
     * 功能描述 成功的响应
     *
     * @param
     * @return com.funtl.itoken.commons.response.ResponseResult<T>
     * @author qyh
     * @date 2020/3/29
     */
    public static <T> ResponseResult<T> success(T data) {
        return new ResponseResult<>(ResponseCodeMessageEnum.SUCCESS.getCode(),
                ResponseCodeMessageEnum.SUCCESS.getMsg(), data);
    }

    @Override
    public String toString() {
        return "ResponseResult{" +
                "responseCodeMessage=" + meta +
                ", data=" + data +
                '}';
    }
}

4、全局异常处理

@ControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ResponseBody
    @ExceptionHandler(value = Throwable.class)
    public ResponseResult<String> exceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception e) {
        if (e instanceof ItokenUaaException) {
            // 业务异常信息组装
            ItokenUaaException be = (ItokenUaaException) e;
            LOGGER.error("request:{} ,message:{}", request.toString(), be.getMessage());
            return new ResponseResult<>(be.getCode(), be.getMessage(), null);
        } else {
            LOGGER.error("request:{} ,message:{}", request.toString(), e);
            return ResponseResult.failEnum(ResponseCodeMessageEnum.UNKNOWN_ERROR);
        }
    }
}

二、前端异常处理(axios拦截器)

与后端定义好接口响应状态、如10010为用户未登录,拦截到10010后可重定向至登陆页面

// 添加响应拦截器
service.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    let data = response.data;
    if (data.meta.code !== 200) {
        if (data.meta.code === 10010) {
            ElementUI.Message.error("用户没有登陆");
            Router.push({name: "login"});
        } else {
            ElementUI.Message.error(data.meta.msg);
            return Promise.reject(data);
        }
    } else {
        return response;
    }
}, function (error) {
    return Promise.reject(error);
});

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 针对SpringBootVue前后端分离设计培养计划管理系统的设计思路和方法,一般可遵循以下步骤: 1. 需求分析:明确系统需求和功能模块,确定系统开发目标和范围。 2. 概要设计:设计系统的整体框架和模块划分,确定系统的技术架构、数据模型等。 3. 详细设计:具体设计系统各个模块的功能实现,制定接口规范和数据库设计方案。 4. 编码实现:根据设计文档进行编码实现,包括前端Vue后端SpringBoot的开发。 5. 测试验收:完成编码后进行单元测试和综合测试,保证系统的质量和稳定性。 6. 部署上线:将系统部署到服务器上,并进行线上测试,确保系统可以正常运行。 在这个过程中,需要注意前后端分离设计的特点,即前端和后端开发相互独立,通过接口进行数据交互。因此,需要制定清晰的接口规范,确保数据传输的正确性和安全性。同时,还需要注意前端和后端技术的兼容性,确保两个端能够无缝对接。 总之,针对SpringBootVue前后端分离设计培养计划管理系统的设计思路和方法,需要在需求分析、概要设计、详细设计、编码实现、测试验收和部署上线等方面进行综合考虑,以确保系统的高效、稳定、安全和可维护性。 ### 回答2: Spring BootVue前后端分离设计是一种常用的Web应用设计模式,在设计培养计划管理系统时,可以采用以下思路和方法: 1. 前后端分离前后端分离是指前端使用Vue进行页面渲染,后端使用Spring Boot提供接口服务。通过这种设计模式,可以有效地解耦前后端逻辑,提高开发效率和系统性能。 2. 定义数据模型:根据培养计划管理系统的需求,定义必要的数据模型。这些模型可以包括学生、课程、考试等信息。使用Java对象模型或者数据库表结构来表示这些模型。 3. 设计接口:基于前后端分离的设计思路,使用Spring Boot设计和实现RESTful接口。这些接口可以包括学生信息查询、课程安排、考试成绩录入等功能。通过严格定义接口规范,前端可以通过调用这些接口获取所需的数据。 4. 前端页面设计:使用Vue进行前端页面的设计和开发。根据系统需求,设计学生信息展示、课程安排、考试成绩录入等页面。使用Vue提供的组件和工具,实现页面的交互和数据展示。 5. 数据交互:前端通过调用后端提供的接口获取所需数据。使用Vue的Ajax、Axios等工具,发送HTTP请求并解析返回的数据。前端可以根据需要进行数据筛选、排序和展示。 6. 系统安全:为了保障系统的安全性,可以在后端使用Spring Security等框架进行权限控制和身份认证。通过定义角色和权限,限制用户操作和访问敏感数据。 7. 测试和部署:在开发完成后,进行系统测试和调试。可以使用JUnit等测试框架对后端接口进行单元测试,使用Vue提供的测试工具对前端页面进行测试。最后,将后端部署到服务器上,并将前端页面打包部署到Web服务器上。 通过采用Spring BootVue前后端分离设计,可以实现系统开发的高效和灵活性。前后端分离设计模式可以有效解耦前后端逻辑,提高系统性能和扩展性。同时,Spring BootVue作为流行的开发框架,拥有庞大的社区支持和丰富的开发资源,可以大大提升系统开发的效率和质量。 ### 回答3: SpringBootVue是目前非常流行的前后端分离开发框架。设计和培养一个计划管理系统需要以下步骤和方法。 1.需求分析:首先,要清楚定义计划管理系统的功能和需求,包括用户管理、计划创建、查看和修改计划、日历展示等功能。 2.数据库设计:根据需求设计数据库模型,确定需要的表和字段,并建立相应的关系。 3.SpringBoot后端开发:使用SpringBoot搭建后端开发环境,根据需求编写相应的控制器、服务和数据访问层。使用Spring Security实现用户认证和授权。 4.Vue前端开发:使用Vue框架搭建前端开发环境,设计和开发用户界面。使用Vue Router实现页面导航和路由跳转。使用Axios进行和后端的数据交互。 5.前后端接口设计:定义前后端之间的接口规范,包括请求方式、参数和返回结果的格式。使用JSON进行数据交互。 6.前后端联调:前后端开发完成后,进行联调测试,确保前后端的数据交互和功能实现的正确性。 7.部署和上线:将后端代码打包成jar包或war包,将前端代码打包成静态资源,部署到服务器上,配置好相应的环境和数据库信息,使系统能在服务器上运行。 以上是一般的设计思路和方法,当然具体实现还有很多细节需要考虑,比如数据校验、异常处理、权限管理等等。一个好的计划管理系统应该具备良好的用户体验和响应速度,因此在设计和开发过程中需要注重系统的性能优化。同时,定期进行系统的维护和更新,修复漏洞和改进功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值