1、使用@ControllerAdvice和@ExceptionHandler来处理全局异常这是目前很常见的一种方式,强烈推荐。测试代码中使用了Junit5。如果你新建一个项目来验证下面的代码,记得添加相关的依赖。1.新建一个异常信息实体类,这个不是必须的,主要用来封装异常信息。src/main/java/com/twuc/webApp/exception/ErrorResponse.java/***@authorshuang.kou*/publicclassErrorResponse{privateStringmessage;privateStringerrorTypeName;publicErrorResponse(Exceptione){this(e.getClass().getName(),e.getMessage());}publicErrorResponse(StringerrorTypeName,Stringmessage){this.errorTypeName=errorTypeName;this.message=message;}......省略getter/setter方法}2.自定义异常类型src/main/java/com/twuc/webApp/exception/ResourceNotFoundException.java一般我们处理RuntimeException,所以如果需要自定义异常类型,直接集成这个类即可。/***@authorshuang.kou*自定义异常类型*/publicclassResourceNotFoundExceptionextendsRuntimeException{privateStringmessage;publicResourceNotFoundException(){super();}publicResourceNotFoundException(Stringmessage){super(message);this.message=message;}@OverridepublicStringgetMessage(){returnmessage;}publicvoidsetMessage(Stringmessage){this.message=message;}}3.新建一个异常处理类,我们只需要在该类上加上@ControllerAdvice注解,就可以成为一个全局的异常处理类。当然你也可以通过assignableTypes指定一个具体的Controller类,让异常处理类只处理具体类抛出的异常。src/main/java/com/twuc/webApp/exception/GlobalExceptionHandler.java/***@authorshuang.kou*/@ControllerAdvice(assignableTypes={ExceptionController.class})@ResponseBodypublicclassGlobalExceptionHandler{ErrorResponseillegalArgumentResponse=newEx"ErrorResponse(参数错误!"));ErrorResponseresourseNotFoundResponse=newErrorResponse(newResourceNotFoundException("Sorry,theresoursenotfound!"));@ExceptionHandler(value=Exception.class)//拦截所有异常,这里只是为了演示,一般情况下,一个方法专门处理异常publicResponseEntity4.controller模拟抛异常src/main/java/com/twuc/webApp/web/ExceptionController.java/***@authorshuang.kou*/@RestController@RequestMapping("/api")publicclassExceptionController{@GetMapping("/illegalArgumentException")publicvoidthrowException(){thrownewIllegalArgumentException();}@GetMapping("/resourceNotFoundException")publicvoidthrowException2(){thrownewResourceNotFoundException();}}使用Get请求localhost:8080/api/resourceNot(curl-i-s-XGETurl),服务器返回的JSON数据如下:{"message":"Sorry,theresoursenotfound!","errorTypeName":"com.twuc.webApp.exception.ResourceNotFoundException"}5.编写org.springframework.boot.test包提供的测试类MockMvc,实现模拟Http请求,一般用于我们测试controller层/***@authorshuang.kou*/@AutoConfigureMockMvc@SpringBootTestpublicclassExceptionTest{@AutowiredMockMvcmockMvc;@Testvoidshould_return_400_if_param_not_valid()throwsException{mockMvc.perform(get("/api/illegalArgumentException0(0))).andExpect(状态.andExpect(jsonPath("$.message").value("参数错误!"));}@Testvoidshould_return_404_if_resourse_not_found()throwsException{mockMvc.perform(get("/api/resourceNotFoundException")).andExpect(status().is(404))。andExpect(jsonPath("$.message").value("Sorry,theresoursenotfound!"));}}二、@ExceptionHandler在Controller层面处理异常我们刚刚说过使用@ControllerAdvice注解可以通过assignableTypes指定具体的类,使得异常处理类只处理特定类抛出的异常。所以这种处理异常的方式现在其实用的比较少。我们把下面的代码移到src/main/java/com/twuc/webApp/exception/GlobalExceptionHandler。爪哇。@ExceptionHandler(value=Exception.class)//剔除所有异常publicResponseEntity
