SpringBoot2.0系列教程(五)Springboot框架添加全局异常处理
2019-04-03 15:20
791 查看
版权声明:转载请联系作者 https://blog.csdn.net/weixin_44870919/article/details/88996235
Hello大家好,本章我们添加全局异常处理。另求各路大神指点,感谢
一:为什么需要定义全局异常
在互联网时代,我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,所以我们需要对异常进行捕获,然后给予相应的处理,来减少程序异常对用户体验的影响
二:添加业务类异常
在前面说过的ret文件夹下创建ServiceException
[code]package com.example.demo.core.ret; import java.io.Serializable; /** * @Description: 业务类异常 * @author 张瑶 * @date 2018/4/20 14:30 * */ public class ServiceException extends RuntimeException implements Serializable{ private static final long serialVersionUID = 1213855733833039552L; public ServiceException() { } public ServiceException(String message) { super(message); } public ServiceException(String message, Throwable cause) { super(message, cause); } }
三:添加异常处理配置
打开上篇文章创建的WebConfigurer,添加如下方法
[code]@Override public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) { exceptionResolvers.add(getHandlerExceptionResolver()); } /** * 创建异常处理 * @return */ private HandlerExceptionResolver getHandlerExceptionResolver(){ HandlerExceptionResolver handlerExceptionResolver = new HandlerExceptionResolver(){ @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) { RetResult<Object> result = getResuleByHeandleException(request, handler, e); responseResult(response, result); return new ModelAndView(); } }; return handlerExceptionResolver; } /** * 根据异常类型确定返回数据 * @param request * @param handler * @param e * @return */ private RetResult<Object> getResuleByHeandleException(HttpServletRequest request, Object handler, Exception e){ RetResult<Object> result = new RetResult<>(); if (e instanceof ServiceException) { result.setCode(RetCode.FAIL).setMsg(e.getMessage()).setData(null); return result; } if (e instanceof NoHandlerFoundException) { result.setCode(RetCode.NOT_FOUND).setMsg("接口 [" + request.getRequestURI() + "] 不存在"); return result; } result.setCode(RetCode.INTERNAL_SERVER_ERROR).setMsg("接口 [" + request.getRequestURI() + "] 内部错误,请联系管理员"); String message; if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; message = String.format("接口 [%s] 出现异常,方法:%s.%s,异常摘要:%s", request.getRequestURI(), handlerMethod.getBean().getClass().getName(), handlerMethod.getMethod() .getName(), e.getMessage()); } else { message = e.getMessage(); } LOGGER.error(message, e); return result; } /** * @Title: responseResult * @Description: 响应结果 * @param response * @param result * @Reutrn void */ private void responseResult(HttpServletResponse response, RetResult<Object> result) { response.setCharacterEncoding("UTF-8"); response.setHeader("Content-type", "application/json;charset=UTF-8"); response.setStatus(200); try { response.getWriter().write(JSON.toJSONString(result,SerializerFeature.WriteMapNullValue)); } catch (IOException ex) { LOGGER.error(ex.getMessage()); } }
四:添加配置文件
Spring Boot 中, 当用户访问了一个不存在的链接时, Spring 默认会将页面重定向到 **/error** 上, 而不会抛出异常.
既然如此, 那我们就告诉 Spring Boot, 当出现 404 错误时, 抛出一个异常即可.
在
application.properties中添加两个配置:
[code]spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false
上面的配置中, 第一个
spring.mvc.throw-exception-if-no-handler-found告诉 SpringBoot 当出现 404 错误时, 直接抛出异常. 第二个
spring.resources.add-mappings告诉 SpringBoot 不要为我们工程中的资源文件建立映射.
五:创建测试接口
[code]package com.example.demo.service.impl; import com.example.demo.core.ret.ServiceException; import com.example.demo.dao.UserInfoMapper; import com.example.demo.model.UserInfo; import com.example.demo.service.UserInfoService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; /** * @author 张瑶 * @Description: * @time 2018/4/18 11:56 */ @Service public class UserInfoServiceImpl implements UserInfoService{ @Resource private UserInfoMapper userInfoMapper; @Override public UserInfo selectById(Integer id){ UserInfo userInfo = userInfoMapper.selectById(id); if(userInfo == null){ throw new ServiceException("暂无该用户"); } return userInfo; } }
UserInfoController.java
[code]package com.example.demo.controller; import com.example.demo.core.ret.RetResponse; import com.example.demo.core.ret.RetResult; import com.example.demo.core.ret.ServiceException; import com.example.demo.model.UserInfo; import com.example.demo.service.UserInfoService; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; /** * @author 张瑶 * @Description: * @time 2018/4/18 11:39 */ @RestController @RequestMapping("userInfo") public class UserInfoController { @Resource private UserInfoService userInfoService; @PostMapping("/hello") public String hello(){ return "hello SpringBoot"; } @PostMapping("/selectById") public RetResult<UserInfo> selectById(Integer id){ UserInfo userInfo = userInfoService.selectById(id); return RetResponse.makeOKRsp(userInfo); } @PostMapping("/testException") public RetResult<UserInfo> testException(Integer id){ List a = null; a.size(); UserInfo userInfo = userInfoService.selectById(id); return RetResponse.makeOKRsp(userInfo); } }
六:接口测试
访问
192.168.1.104:8080/userInfo/selectById参数
id:3
[code]{ "code": 400, "data": null, "msg": "暂无该用户" }
访问
192.168.1.104:8080/userInfo/testException
[code]{ "code": 500, "data": null, "msg": "接口 [/userInfo/testException] 内部错误,请联系管理员" }
项目地址
码云地址: https://gitee.com/beany/mySpringBoot
GitHub地址: https://github.com/MyBeany/mySpringBoot
写文章不易,如对您有帮助,请帮忙点下star
结尾
springboot添加全局异常处理已完成,后续功能接下来陆续更新。另求各路大神指点,感谢大家。
相关文章推荐
- SpringBoot2.0系列教程(七)Springboot框架添加PageHelper分页查询功能
- SpringBoot系列之三全局异常的捕获处理
- SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
- Spring Boot 全局异常处理 与 Hibernate Validator校验框架整合
- spring boot学习教程(4):全局异常处理代码demo
- SpringBoot2.0系列教程(十)Springboot框架通过freemarker自动生成service,serviceImpl,controller功能
- Spring Boot干货系列:(十三)Spring Boot全局异常处理整理
- SpringBoot学习——全局异常处理设置(返回JSON)
- springBoot注解大全JPA注解springMVC相关注解全局异常处理
- springBoot 全局异常处理 报错 : Could not resolve method parameter at index 0 in public .....
- springboot视频教程系列(一)SpringBoot框架初相识-王勇-专题视频课程
- SpringBoot全局异常处理(续)
- Springboot整合(5)——全局异常处理
- Spring Boot教程八:捕获全局异常
- Spring-Boot(五) 全局异常处理
- SpringBoot学习之全局异常处理设置(返回JSON)
- SpringBoot入门——局部与全局的异常处理
- springboot(三)一实战(一)之全局异常处理
- Spring Boot教程九:捕获全局异常(二)
- SpringBoot框架中REST接口的异常处理方法