@ResponseStatus(value=HttpStatus.NOT_FOUND) public class StaffNotFoundException extends Exception { }
自定义StaffNotFoundException异常类:员工信息没有找到异常。
@ResponseStatus(value=HttpStatus.NOT_FOUND)作用是将该异常映射为http 404异常,就是浏览器接受到的是404错误。
@Controller @RequestMapping("/") public class PCInfoController { @Autowired PCInfoRestClient PCInfoRestClient; /** * 个人信息页面 * @param * @return * @throws StaffNotFoundException */ @RequestMapping(value="info",method=RequestMethod.GET) public String staffInfo(Model model) throws StaffNotFoundException { HashMap staff = PCInfoRestClient.getStaff(); if(staff == null) throw new StaffNotFoundException(); model.addAttribute("staff", staff); return "info"; } @RequestMapping(value="staff/notfound",method=RequestMethod.GET) public String error(Model model) { return "error"; } }
控制器中如果获得staff是null 则抛出StaffNotFoundException异常。
@ControllerAdvice public class CommonExceptionHandler { @ExceptionHandler(StaffNotFoundException.class) public String handleStaffNotFound(Exception exception, WebRequest request) { return "redirect:/staff/notfound"; } }
@controllerAdvice注解的CommonExceptionHandler 类中,handleStaffNotFound()方法上加了@ExceptionHandler(StaffNotFoundException.class)注解,表示处理当控制器抛出StaffNotFoundException异常时,将会委托该方法来处理。
@controllerAdvice最为实用的一个场景就是将所有@ExceptionHandler方法收集到一个类中,这样所有的异常都能在一个地方进行一致处理。
@ControllerAdvice默认所有控制的抛出的异常都会在这个类进行处理
@ControllerAdvice(annotations = {PCInfoController .class}) 配置你需要拦截的控制器,
@ControllerAdvice(basePackages = "com.demo") 配置你需要路径下的控制器