使用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("系统处理业务时出现了异常");
}
}