Hello 大家好, 本章我们添加全局异常处理. 有问题可以联系我 mr_beany@163.com. 另求各路大神指点, 感谢
一: 为什么需要定义全局异常
在互联网时代, 我们所开发的应用大多是直面用户的, 程序中的任何一点小疏忽都可能导致用户的流失, 而程序出现异常往往又是不可避免的, 所以我们需要对异常进行捕获, 然后给予相应的处理, 来减少程序异常对用户体验的影响
二: 添加业务类异常
在前面说过的 ret 文件夹下创建 ServiceException
- 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, 添加如下方法
- @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());
- }
- }
四: 创建测试接口
- 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
- 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": 400,
- "data": null,
- "msg": "暂无该用户"
- }
访问
- 192.168.1.104:8080/userInfo/testException
- {
- "code": 500,
- "data": null,
- "msg": "接口 [/userInfo/testException] 内部错误, 请联系管理员"
- }
项目地址
https://gitee.com/beany/mySpringBoot
写文章不易, 如对您有帮助, 请帮忙点下 star
结尾
springboot 添加全局异常处理已完成, 后续功能接下来陆续更新, 有问题可以联系我 mr_beany@163.com. 另求各路大神指点, 感谢大家.
来源: https://juejin.im/post/5ad9bad1518825671951d967