springMVC使用@ControllerAdvice实现异常处理

控制器异常处理:

@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") 配置你需要路径下的控制器

猜你喜欢

转载自chenshangge.iteye.com/blog/2302005