`
raymond.chen
  • 浏览: 1433443 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Controller层的全局异常统一处理

 
阅读更多

使用@ControllerAdvice和@ExceptionHandler两个注解实现Controller层的全局异常统一处理。

 

特别介绍:

       用@ModelAttributes注解标注的方法用于将属性值收集到一个Model类中,并应用到所有的Controller上。

 

 

GlobalExceptionHandler类源码:

@ControllerAdvice
//@RestControllerAdvice //全部异常处理返回json时可以使用此Advice
public class GlobalExceptionHandler {
	public static final String DEFAULT_ERROR_VIEW = "error";
    
    /**
     * 返回json格式的异常信息
	 * RestException为自定义异常类
     */
    @ResponseBody
    @ExceptionHandler(value = RestException.class)
    public Map<String, String> restErrorHandler(RestException ex) {
        Map<String, String> map = new HashMap<String, String>();
        map.put("code", ex.getCode());
        map.put("message", ex.getMessage());
        return map;
    }
    
    /**
     * 文件上传异常
     */
    @ExceptionHandler(MultipartException.class)
    public ModelAndView multipartErrorHandler(MultipartException ex){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("url", "");
        modelAndView.addObject("exception", "文件上传出错:" + ex.toString());
        modelAndView.setViewName(DEFAULT_ERROR_VIEW);
        return modelAndView;
    }

	/**
	 * 异常信息显示到error.ft页面
	 */
    @ExceptionHandler(value = Throwable.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest request, Throwable ex) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("url", request.getRequestURL());
        modelAndView.addObject("exception", ex);
        modelAndView.setViewName(DEFAULT_ERROR_VIEW);
        return modelAndView;
    }
    
    /**
     * 把值绑定到Model中,使全局@RequestMapping可以获取到该值,通过 ModelMap 获取
     */
    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("author", "cjm");
    }
}

 

使用全局参数author:

@Controller
public class IndexController {
	@RequestMapping("/main")
    public String main(ModelMap modelMap) {
		System.out.println(modelMap.get("author"));
        return "main";
    }
}

 

error.ftl文件:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8" />
    <title>统一异常处理</title>
</head>
<body>
    <h1>Error Handler</h1>
    <div>url: ${url?if_exists}</div>
    <#if exception?has_content><div>error message: ${exception?string}</div></#if>
</body>
</html>

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics