千家信息网

SpringBoot全局异常处理方式是什么

发表于:2024-11-13 作者:千家信息网编辑
千家信息网最后更新 2024年11月13日,这篇文章主要讲解了"SpringBoot全局异常处理方式是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"SpringBoot全局异常处理方式是什么
千家信息网最后更新 2024年11月13日SpringBoot全局异常处理方式是什么

这篇文章主要讲解了"SpringBoot全局异常处理方式是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"SpringBoot全局异常处理方式是什么"吧!

SpringBoot全局异常处理

为了让客户端能有一个更好的体验,当客户端发送请求到服务端发生错误时服务端应该明确告诉客户端错误信息。

SpringBoot内置的异常处理返回的界面太杂乱,不够友好。我们需要将异常信息做封装处理响应给前端。本文介绍的为将错误信息统一封装成如下格式json响应给前端。

{        code:10001,        message:xxxxx,        request:GET url}

自定义异常类

package com.lin.missyou.exception;public class HttpException extends RuntimeException{    protected Integer code;    protected Integer httpStatusCode;    public Integer getCode() {        return code;    }    public void setCode(Integer code) {        this.code = code;    }    public Integer getHttpStatusCode() {        return httpStatusCode;    }    public void setHttpStatusCode(Integer httpStatusCode) {        this.httpStatusCode = httpStatusCode;    }}
package com.lin.missyou.exception;public class NotFoundException extends HttpException{    public NotFoundException(int code){        this.httpStatusCode = 404;        this.code = code;    }}
package com.lin.missyou.exception;public class ForbiddenException extends HttpException{    public ForbiddenException(int code){        this.httpStatusCode = 403;        this.code = code;    }}

创建一个用于封装异常信息的类UnifyResponse

package com.lin.missyou.core;public class UnifyResponse {    private int code;    private String message;    private String request;    public int getCode() {        return code;    }    public String getMessage() {        return message;    }    public String getRequest() {        return request;    }    public UnifyResponse(int code, String message, String request) {        this.code = code;        this.message = message;        this.request = request;    }}

将异常信息写在配置文件exception-code.properties里

lin.codes[10000] = 通用异常lin.codes[10001] = 通用参数错误

自定义配置类管理配置文件

package com.lin.missyou.core.configuration;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.PropertySource;import org.springframework.stereotype.Component;import java.util.HashMap;import java.util.Map;@PropertySource(value="classpath:config/exception-code.properties")@ConfigurationProperties(prefix = "lin")@Componentpublic class ExceptionCodeConfiguration {    private Map codes = new HashMap<>();    public Map getCodes() {        return codes;    }    public void setCodes(Map codes) {        this.codes = codes;    }    public String getMessage(int code) {        String message = codes.get(code);        return message;    }}

创建一个全局异常处理类GlobalExceptionAdvice,用@ControllerAdvice标明异常处理类。@ResponseStatus用于指定http状态码。

@ExceptionHandler标明异常处理器,传入参数指定当前函数要处理哪种类型的异常。Springboot会帮我们把这些异常信息传入到函数。第一个函数用于处理未知异常,不需要向前端提供详细的错误原因,只需提示统一的文本信息即可。

第二个函数用于处理已知异常,需要指明具体的错误原因,需要根据Exception传递过来的信息灵活的定制httpStatusCode。ResponseEntity可以自定义很多属性,包括可以设置httpheaders,httpbodys,httpStatus。

package com.lin.missyou.core;import com.lin.missyou.core.config.ExceptionCodeConfiguration;import com.lin.missyou.exception.HttpException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpStatus;import org.springframework.http.MediaType;import org.springframework.http.ResponseEntity;import org.springframework.validation.ObjectError;import org.springframework.web.bind.MethodArgumentNotValidException;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.ResponseStatus;import javax.servlet.http.HttpServletRequest;import javax.validation.ConstraintViolation;import javax.validation.ConstraintViolationException;import java.util.List;@ControllerAdvicepublic class GlobalExceptionAdvice {    @Autowired    ExceptionCodeConfiguration exceptionCodeConfiguration ;    @ExceptionHandler(Exception.class)    @ResponseBody    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)    public UnifyResponse handleException(HttpServletRequest req,Exception e){        String method = req.getMethod();        String requestUrl = req.getRequestURI();        System.out.println(e);        UnifyResponse unifyResponse = new UnifyResponse(9999,"服务器错误",method+" "+requestUrl);        return unifyResponse;    }    @ExceptionHandler(HttpException.class)    public ResponseEntity handleHttpException(HttpServletRequest req, HttpException e){        String method = req.getMethod();        String requestUrl = req.getRequestURI();        System.out.println(e);        UnifyResponse unifyResponse = new UnifyResponse(e.getCode(),exceptionCodeConfiguration.getMessage(e.getCode()),method+" "+requestUrl);        HttpHeaders httpHeaders = new HttpHeaders();        httpHeaders.setContentType(MediaType.APPLICATION_JSON);        HttpStatus httpStatus = HttpStatus.resolve(e.getHttpStatusCode());        ResponseEntity responseEntity = new ResponseEntity(unifyResponse,httpHeaders,httpStatus);        return responseEntity;    }    //参数校验    @ExceptionHandler(MethodArgumentNotValidException.class)    @ResponseBody    @ResponseStatus(HttpStatus.BAD_REQUEST)    public UnifyResponse handleBeanValidation(HttpServletRequest req, MethodArgumentNotValidException e){        String method = req.getMethod();        String requestUrl = req.getRequestURI();        List errors = e.getBindingResult().getAllErrors();        String message = formatAllErrorMessages(errors);        return new UnifyResponse(10001,message,method+" "+requestUrl);    }    private String formatAllErrorMessages(List errors){        StringBuffer errorMsg = new StringBuffer();        errors.forEach(error ->                errorMsg.append(error.getDefaultMessage()).append(";")        );        return errorMsg.toString();    }    @ExceptionHandler(ConstraintViolationException.class)    @ResponseBody    @ResponseStatus(HttpStatus.BAD_REQUEST)    public UnifyResponse handleConstrainException(HttpServletRequest req, ConstraintViolationException e){        String method = req.getMethod();        String requestUrl = req.getRequestURI();        String message = e.getMessage();        return new UnifyResponse(10001,message,method+" "+requestUrl);    }}

响应信息可能会出现乱码现象,修改配置文件编码。在设置面板搜索File Encodings,Default encoding for properties files选择UTF-8,勾选Transparent native-to-ascii conversion

springboot全局异常处理--@ControllerAdvice+ExceptionHandler

一、全局捕获异常后,返回json给浏览器

项目结构:

1、自定义异常类 MyException.java

package com.gui.restful;/** * 自定义异常类 */public class MyException extends RuntimeException{    private String code;    private String msg;    public MyException(String code,String msg){        this.code=code;        this.msg=msg;    }    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;    }}

2、控制器 MyController.java

package com.gui.restful;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;/** * controller抛出异常 */@RestControllerpublic class MyController {    @RequestMapping("hello")    public String hello() throws Exception{        throw new MyException("101","系统异常");    }}

3、全局异常处理类 MyControllerAdvice

package com.gui.restful;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;import java.util.Map;/** * 全局异常捕获处理 */@ControllerAdvice //controller增强器public class MyControllerAdvice {    @ResponseBody    @ExceptionHandler(value=MyException.class) //处理的异常类型    public Map myExceptionHandler(MyException e){        Map map=new HashMap<>();        map.put("code",e.getCode());        map.put("msg",e.getMsg());        return map;    }}

4、运行结果

启动应用,访问 http://localhost:8080/hello,出现以下结果,说明自定义异常被成功拦截

二、全局捕获异常后,返回页面给浏览器

1、自定义异常类 MyException.java(同上)

2、控制器 MyController.java(同上)

3、全局异常处理类 MyControllerAdvice

package com.gui.restful;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.servlet.ModelAndView;import java.util.HashMap;import java.util.Map;/** * 全局异常捕获处理 */@ControllerAdvice //controller增强器public class MyControllerAdvice {    @ExceptionHandler(value=MyException.class) //处理的异常类型    public ModelAndView myExceptionHandler(MyException e){        ModelAndView modelAndView=new ModelAndView();        modelAndView.setViewName("error");        modelAndView.addObject("code",e.getCode());        modelAndView.addObject("msg",e.getMsg());        return modelAndView;    }}

4、页面渲染 error.ftl(用freemarker渲染)

pom.xml中引入freemarker依赖

                                     org.springframework.boot                        spring-boot-starter-freemarker                

error.ftl

错误页面

code:$[code]

msg:${msg}

5、运行结果

启动应用,访问 http://localhost:8080/hello,出现以下结果,说明自定义异常被成功拦截

感谢各位的阅读,以上就是"SpringBoot全局异常处理方式是什么"的内容了,经过本文的学习后,相信大家对SpringBoot全局异常处理方式是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

处理 全局 信息 错误 方式 函数 结果 配置 前端 参数 客户 客户端 文件 类型 页面 学习 封装 服务 成功 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 通过召开网络安全联席会 东坝规划软件开发 游戏外挂软件开发教程 梦幻西游一区第一个服务器叫什么 spss数据库问卷 美国最好的站群服务器 期刊数据库是什么文献 衢州软件开发商服务至上 数据库中表的结构用什么来表示 数据库多表连接查询所有客户信息 成都淘运网络技术有限公司 宣传网络安全项目推荐理由 温州智慧消防软件开发 上海耀橙网络技术 网络安全一般用什么语言 大数据软件开发技术是什么 杭电网络安全学院官网 怎样自动整理数据库 海门口碑好的网络技术诚信经营 装配软件开发 vr互动软件开发费用 达梦数据库cec 网络安全小故事大道理 河北省第二届网络安全大赛 什么报错会导致服务器数据库丢失 网络技术员月薪 ob数据库适合小微企业吗 手机上怎么登陆任天堂香港服务器 个人博客的数据库表 广州市珠海联通网络技术部工资
0