千家信息网

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

发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,这篇文章主要讲解了"SpringBoot全局异常处理方式是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"SpringBoot全局异常处理方式是什么
千家信息网最后更新 2024年11月14日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安全错误 数据库的锁怎样保障安全 数据库论文参考文献大全 大学生角度谈网络安全 扫健康码显示服务器异常怎么回事 我的世界蓝色村民在哪一个服务器 自治区网络安全管理条例 我的世界服务器腐竹视角 mc服务器如何取消管理员 警察怎么通过dna数据库找人 深圳小吧嗒互联网科技有限公司 FDD软件开发 智能建筑网络安全么 孝感网站建设服务器 什么是数据库授权 java抢票软件开发 三级计算机网络技术大题怎么做 软件开发计算机培训学校入校条件 如何按照规则进行数据库筛选 云服务器一直在攻击怎么办 易语言 服务器组件 虚拟化服务器搭建设置 软件开发哪个门槛低应用广 淘宝显示服务器走丢了 驻场数据库运维工程师招聘 电脑的网络老是无法连接服务器 后端要学的数据库 临沂网络安全教育宣传 十八大网络安全工作部署 网络安全短文100字左右 关于网络安全手抄报图片内容 江西曙光服务器续保哪家便宜
0