一、@ControllerAdvice注解
在Spring Boot开发中,开发人员通常需要在代码中对异常进行处理。可以使用@ControllerAdvice注解定义一个类,该类中可以定义多个@ExceptionHandler注解方法来实现对全局异常的处理。
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class) @ResponseBody public MaphandleException(Exception e){ Map map = new HashMap<>(); map.put("code","500"); map.put("message",e.getMessage()); return map; } }
使用@ControllerAdvice注解定义的异常处理类,其中使用@ExceptionHandler注解标注的方法可以捕捉到对应的异常类型并进行处理。在上面的例子中,handleException方法捕捉到了Exception类型的异常,并返回了一个Map对象,其中包含了异常的状态码和错误信息。
二、@RestControllerAdvice注解
@RestControllerAdvice注解与@ControllerAdvice注解类似,但是在返回值类型上有所不同。使用@RestControllerAdvice注解定义的异常处理类,其中使用@ExceptionHandler注解标注的方法返回值为Object类型。以下是一个使用@RestControllerAdvice注解的异常处理类的例子:
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class) public Object handleException(Exception e){ Mapmap = new HashMap<>(); map.put("code","500"); map.put("message",e.getMessage()); return map; } }
在这个例子中,handleException方法的返回值为Object类型。在方法中,定义了返回值为Map类型的变量map,序列化后返回该变量。
三、@ExceptionHandler注解
除了在@ControllerAdvice或@RestControllerAdvice注解标注的类中使用@ExceptionHandler注解处理异常外,在Controller中也可以使用该注解来处理局部异常。以下是一个Controller中使用@ExceptionHandler注解处理异常的例子:
@RestController @RequestMapping("/demo") public class DemoController { @ExceptionHandler(value = Exception.class) public MaphandleException(Exception e){ Map map = new HashMap<>(); map.put("code","500"); map.put("message",e.getMessage()); return map; } @GetMapping("/{id}") public Map getDemoById(@PathVariable int id){ // 模拟获取实体对象的过程 if(id == 1){ throw new RuntimeException("ID不能为1"); } Map map = new HashMap<>(); map.put("id",id); map.put("name","demo"); return map; } }
在上面的例子中,当Controller的getDemoById方法执行时,如果抛出了RuntimeException异常,handleException方法就会被调用并返回一个Map对象。如果没有抛出异常,则正常返回实体对象。
四、@ResponseStatus注解
@ResponseStatus注解可以用来定义异常的HTTP响应状态码和自定义的异常消息。在Spring Boot开发中,我们可以使用该注解来管理相同类型的异常,并为它们指定相同的HTTP响应状态码和自定义异常信息。以下是一个使用@ResponseStatus注解的例子:
@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "Forbidden") public class ForbiddenException extends RuntimeException { }
在上面的例子中,定义了一个ForbiddenException类,并使用@ResponseStatus注解为该异常定义了返回状态码为403,错误信息为"Forbidden"。
五、结合自定义异常使用
在开发中,我们经常会使用自定义异常来处理业务中的异常情况。这个时候,结合上面介绍的注解进行全局异常处理会更加方便。以下是一个使用自定义异常和全局异常处理注解的例子:
@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "Forbidden") public class ForbiddenException extends RuntimeException { } @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = ForbiddenException.class) public MaphandleForbiddenException(ForbiddenException e){ Map map = new HashMap<>(); map.put("code","403"); map.put("message",e.getMessage()); return map; } @ExceptionHandler(value = Exception.class) public Map handleException(Exception e){ Map map = new HashMap<>(); map.put("code","500"); map.put("message",e.getMessage()); return map; } } @RestController @RequestMapping("/demo") public class DemoController { @GetMapping("/{id}") public Map getDemoById(@PathVariable int id){ // 模拟获取实体对象的过程 if(id == 1){ throw new ForbiddenException(); } Map map = new HashMap<>(); map.put("id",id); map.put("name","demo"); return map; } }
在上面的例子中,定义了一个自定义异常ForbiddenException,并使用@ResponseStatus注解为该异常定义了返回状态码为403和错误信息为"Forbidden"。在全局异常处理注解中,分别使用@ExceptionHandler注解处理ForbiddenException和Exception两个异常类型,并分别返回了对应的Map对象。在Controller中,如果抛出了ForbiddenException异常,handleForbiddenException方法就会被调用并返回一个Map对象,如果抛出了其他类型的异常,则调用handleException方法返回Map对象。
六、总结
在Spring Boot开发中,合理使用全局异常处理注解可以避免在代码中出现大量的重复代码。在定义注解时,需注意注解的使用范围和返回值类型。结合自定义异常使用,可更好地管理代码异常情况。