使用springBoot的全局异常处理来处理,参数校验、业务的异常

使用springBoot的全局异常处理来处理,参数校验、业务的异常

前言

我们在开发业务代码的时候,后台出现的异常需要有好的提示到前台,这个时候就需要后端开发人员要在每个业务代码中都要处理异常并有好的提示到前端,但是这样处理比较繁琐,需要在每个业务都处理。使用全局异常处理来处理程序运行时的异常,业务代码的编写人员只需要处理业务代码,不需要关注过多的异常处理,只需把异常抛出,异常处理类会报异常信息有好的提示前端

源码地址:https://github.com/lizhongxiang12138/eurekaManage

项目结构

│  .gitignore
│  build.sh
│  demo.iml
│  dev-product.release
│  Dockerfile
│  eureka-mannage-deployment.yaml
│  eureka-mannage-service.yaml
│  HELP.md
│  mvnw
│  mvnw.cmd
│  pom.xml
│  README.md
│
├─.idea
│  │  compiler.xml
│  │  encodings.xml
│  │  misc.xml
│  │  modules.xml
│  │  uiDesigner.xml
│  │  vcs.xml
│  │  workspace.xml
│  │
│  ├─inspectionProfiles
│  │      Project_Default.xml
│  │
│  └─libraries
│
├─src
│  ├─main
│  │  ├─java
│  │  │  └─com
│  │  │      └─lzx
│  │  │          └─demo
│  │  │              │  DemoApplication.java
│  │  │              │
│  │  │              │
│  │  │              ├─config
│  │  │              │      GlobalExceptionHandler.java
│  │  │              │
│  │  │              ├─controller
│  │  │              │      StudentController.java
│  │  │              │
│  │  │              ├─Dao
│  │  │              │      StudentDao.java
│  │  │              │
│  │  │              ├─dto
│  │  │              │      ReturnData.java
│  │  │              │
│  │  │              ├─entity
│  │  │              │      Student.java
│  │  │              │
│  │  │              ├─exception
│  │  │              │      SystemRunServiceException.java
│  │  │              │
│  │  │              └─service
│  │  │                  │  StudentService.java
│  │  │                  │
│  │  │                  └─impl
│  │  │                          StudentServiceImpl.java
│  │  │
│  │  └─resources
│  │      │  application.yml
│  │      │  bootstrap.yml
│  │      │
│  │      ├─static
│  │      │      apps.html
│  │      │      testSendToKafka-ui.html
│  │      │
│  │      └─templates

定义异常处理类

全局异常处理类,统一捕获异常信息,把异常信息封装为统一的交互模型返回到前端

package com.lzx.demo.config;

import com.lzx.demo.dto.ReturnData;
import com.lzx.demo.exception.SystemRunServiceException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.rest.webmvc.ResourceNotFoundException;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
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 java.util.List;

/**
 * 全局的异常处理
 * @author lzx
 *
 */
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 参数校验错误的异常处理
     * @param e 参数校验错误异常
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public ReturnData handlerMethodArgumentNotValidException(MethodArgumentNotValidException e){
        log.error(e.getMessage(),e);
        BindingResult bindingResult = e.getBindingResult();
        StringBuffer errorMsg = new StringBuffer();
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        allErrors.forEach(objectError -> {
            errorMsg.append(objectError.getDefaultMessage()).append(";");
        });
        return new ReturnData(HttpStatus.INTERNAL_SERVER_ERROR.value(),errorMsg.toString(),null);
    }

    /**
     * 查询不到资源
     * @param e 参数校验错误异常
     * @return
     */
    @ExceptionHandler(ResourceNotFoundException.class)
    @ResponseBody
    public ResponseEntity handlerResourceNotFoundException(ResourceNotFoundException e){
        log.error(e.getMessage(),e);
        StringBuffer errorMsg = new StringBuffer();
        errorMsg.append(e.getMessage());
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        ResponseEntity<String> returnDataResponseEntity = new ResponseEntity<String>(null, httpHeaders, HttpStatus.NOT_FOUND);
        return returnDataResponseEntity;
    }

    /**
     * 系统运行时的业务异常
     * 不返回错误码(响应的状态码)
     *
     * @param e 系统运行时的业务异常
     * @return
     */
    @ExceptionHandler(SystemRunServiceException.class)
    @ResponseBody
    public ResponseEntity handlerOpenRequestException(SystemRunServiceException e){
        log.error(e.getMessage(),e);
        StringBuffer errorMsg = new StringBuffer();
        errorMsg.append(e.getMessage());
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        ResponseEntity<ReturnData> returnDataResponseEntity = new ResponseEntity<>(new ReturnData(HttpStatus.INTERNAL_SERVER_ERROR.value(), errorMsg.toString(), null), httpHeaders, HttpStatus.OK);
        return returnDataResponseEntity;
    }


    /**
     * 未知遗产处理
     * @param e 未知异常处理
     * @return
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResponseEntity handlerException(Exception e){
        log.error(e.getMessage(),e);
        StringBuffer errorMsg = new StringBuffer();
        errorMsg.append(e.getMessage());
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        ResponseEntity<ReturnData> returnDataResponseEntity = new ResponseEntity<>(new ReturnData(HttpStatus.INTERNAL_SERVER_ERROR.value(), errorMsg.toString(), null), httpHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
        return returnDataResponseEntity;
    }

}

前端统一的交互模型

package com.lzx.demo.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * 描述:
 *
 * @Auther: lzx
 * @Date: 2019/7/9 13:55
 */
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class ReturnData<T> {

    private int code;

    private String mass;

    private T data;

}

测试用的Controller

package com.lzx.demo.controller;

import com.lzx.demo.base.controller.BaseController;
import com.lzx.demo.dto.ReturnData;
import com.lzx.demo.entity.Student;
import com.lzx.demo.exception.SystemRunServiceException;
import com.lzx.demo.service.StudentService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

/**
 * 描述: 学生api
 *
 * @Auther: lzx
 * @Date: 2019/7/11 17:14
 */
@RestController
@RequestMapping("/student")
public class StudentController extends BaseController<Student> {

    private StudentService studentService;

    public StudentController(StudentService studentService) {
         /*
            !!!!!!!!!!!!!!!!!!!!重点:
            这个时必须的   ·······~~~~~~~~注意哦
         */
        this.baseService = studentService;
        this.studentService = studentService;
    }


    /**
     * 异常处理测试
     * @param student
     * @return
     */
    @PostMapping("/exceptionTest")
    public ReturnData<String> exceptionTest(@RequestBody @Valid Student student){

        //int i = 1/0;
        throw new SystemRunServiceException("系统处理业务时出现了异常");

    }

 }

测试

数据校验测试

在这里插入图片描述

系统抛出业务异常测试

在这里插入图片描述

访问不存在的资源测试

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值