簡介
通過@ControllerAdvice注解可以將對於控制器的全局配置放在同一個位置。
注解了@Controller的類的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
@ControllerAdvice注解將作用在所有注解了@RequestMapping的控制器的方法上
@ExceptionHandler:用於全局處理控制器里的異常。
用法
@ControllerAdvice
@ResponseBody
public class BusinessExceptionHandler {
@ExceptionHandler(value = Exception.class)
public JsonBackData exceptionHandler(HttpServletRequest request, Exception e) {
e.printStackTrace();
JsonBackData back = new JsonBackData();
if (e instanceof BusinessException) {
BusinessException ex = (BusinessException) e;
back.setSuccess(false);
back.setBackMsg(ex.getMessage());
}
return back;
}
加了這個全局配置的Bean后,以前我的代碼是這樣的:
@RequestMapping(value = "queryDetail")
@ResponseBody
public JsonBackData queryDetail(@RequestParam String id) {
JsonBackData back = new JsonBackData();
try {
OpenSourceThrottleAdjustVO vo = openSourceThrottlePlanQueryService.findById(id);
back.setBackData(vo);
back.setSuccess(true);
back.setBackMsg("查詢詳細信息成功");
} catch (BusinessException e) {
back.setSuccess(false);
back.setBackMsg("查詢詳細信息失敗:" + e.getMessage());
}
return back;
}
多了很多無關信息。幾乎每個類都要try catch一下,代碼極度冗余。
但是加了上面的全局處理控制器的異常處理后。代碼就變成了下面的了。
@RequestMapping(value = "queryDetail")
@ResponseBody
public JsonBackData queryDetail(@RequestParam String id) {
JsonBackData back = new JsonBackData();
OpenSourceThrottleAdjustVO vo = openSourceThrottlePlanQueryService.findById(id);
back.setBackData(vo);
back.setSuccess(true);
back.setBackMsg("查詢詳細信息成功");
return back;
}