springboot全局异常处理BasicErrorController和RestControllerAdvice

简介: springboot全局异常处理BasicErrorController和RestControllerAdvice
RestControllerAdvice
@RestControllerAdvice
public class ExceptionHandlerAdvice {

    @ExceptionHandler(value = ToolBoxException.class)
    public Ret<String> doBaseApiException(ToolBoxException e) {
        return Rets.failure(e.getMessage());
    }

}

BasicErrorController
package com.ityu.bean.exception;


import com.ityu.bean.enumeration.BizExceptionEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

@Controller
@Slf4j
public class AppErrorController extends BasicErrorController {
    public AppErrorController(ServerProperties errorAttributes) {
        super(new DefaultErrorAttributes(), errorAttributes.getError());
    }

    /**
     * 覆盖默认的Json响应
     */
    @Override
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes(request,
                isIncludeStackTrace(request, MediaType.ALL));
        HttpStatus status = getStatus(request);
        //输出自定义的Json格式
        Map<String, Object> map = new HashMap<>();
        String msg = body.get("message") + "";
        if (msg.equals(BizExceptionEnum.TOKEN_INVALID.getMessage())) {
            map.put("code", BizExceptionEnum.TOKEN_INVALID.getCode());
        } else {
            map.put("code", -1);
        }
        map.put("msg", msg);
        map.put("status", true);
        map.put("data", "");
        //log.error(String.valueOf(StringUtil.getStrValue(request)));
        return new ResponseEntity<>(map, HttpStatus.valueOf(200));

        // return new ResponseEntity<>(map, status);
    }

    /**
     * 覆盖默认的HTML响应
     */
    @Override
    public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
        //请求的状态
        HttpStatus status = getStatus(request);
        response.setStatus(getStatus(request).value());

        Map<String, Object> model = getErrorAttributes(request,
                isIncludeStackTrace(request, MediaType.TEXT_HTML));
        ModelAndView modelAndView = resolveErrorView(request, response, status, model);
        //指定自定义的视图
        return (modelAndView == null ? new ModelAndView("error", model) : modelAndView);
    }
}

ResponseBodyAdvice
@RestControllerAdvice
public class ApiResBodyAdvice implements ResponseBodyAdvice {

    /**
     * 判断哪些需要拦截
     **/
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    /**
     * 拦截返回数据处理
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {

        //处理扩展字段
        return ApiResBodyAdviceKit.beforeBodyWrite(body);
    }

}
相关文章
|
缓存 前端开发 Java
SpringBoot&SpringMVC统一异常处理之RestControllerAdvice
SpringBoot&SpringMVC统一异常处理之RestControllerAdvice
294 0
|
Java
SpringBoot全局异常@RestControllerAdvice全局异常
SpringBoot全局异常@RestControllerAdvice全局异常
138 0
|
前端开发 Java
Springboot简单利用@RestControllerAdvice优雅的捕获异常
Springboot简单利用@RestControllerAdvice优雅的捕获异常
333 0
|
数据采集 前端开发 Java
SpringBoot使用@RestControllerAdvice无侵入返回统一结果包装
SpringBoot使用@RestControllerAdvice无侵入返回统一结果包装
1093 0
|
Java Spring
SpringBoot 定义全局捕获异常类 @RestControllerAdvice 注解
SpringBoot 定义全局捕获异常类 @RestControllerAdvice 注解
666 0
SpringBoot 定义全局捕获异常类 @RestControllerAdvice 注解
|
1月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
1月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
1月前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。
|
28天前
|
监控 安全 JavaScript
2025基于springboot的校车预定全流程管理系统
针对传统校车管理效率低、信息不透明等问题,本研究设计并实现了一套校车预定全流程管理系统。系统采用Spring Boot、Java、Vue和MySQL等技术,实现校车信息管理、在线预定、实时监控等功能,提升学校管理效率,保障学生出行安全,推动教育信息化发展。