@RestController @RequestMapping("/exceptoin") public class ExceptionController{ @Autowired private LablesService lablesService; private static final Logger log = LoggerFactory.getLogger(ExceptionController.class); @RequestMapping("/get") public String test(Long id){ Lables lable = lablesService.selectById(id); if(lable == null) { throw new SourceNotFindException(); } log.info("id:" + id); return lable.toString(); } @ExceptionHandler(SourceNotFindException.class) public String handlerSource() { return "source is null,please input the source!"; } }
/** * @ResponseStatus注解将异常映射为HTTP状态码。 * @author YF * */ @ResponseStatus(value = HttpStatus.NOT_FOUND,reason = "source not find") public class SourceNotFindException extends RuntimeException{ private static final long serialVersionUID = -6152421773125413417L; }
以上方法只能处理同一控制器中所有方法抛出的指定异常,如果要处理所有控制器中方法抛出的异常就需要将处理方法定义到控制器通知类中。
控制器通知
@ExceptionHandler注解标注的方法;
@InitBinder注解标注的方法;
@ModelAttribute注解标注的方法。
带有ControllerAdvice注解的类中,以上所述的这些方法会运用到整个应用程序所有控制器中带有@RequestMapping注解的方法上。
@ControllerAdvice最为实用的一个场景就是将所有的@ExceptionHandler方法收集到一个类中,这样所有控制器的异常就能在一个地方进行一致的处理。
@ControllerAdvice public class ExceptionHandler { @org.springframework.web.bind.annotation.ExceptionHandler(SourceNotFindException.class) public String sourceNotNull() { return "source is null!"; } }
现在,如果任意的控制器方法抛出了DuplicateSpittleException,不管这个方法位于哪个控制器中,都会调用这个duplicateSpittleHandler()方法来处理异常。