关键词:
在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。参考:@ControllerAdvice 文档
一、介绍
创建 MyControllerAdvice,并添加 @ControllerAdvice注解。
package com.sam.demo.controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
/**
* controller 增强器
* @author sam
* @since 2017/7/17
*/
@ControllerAdvice
public class MyControllerAdvice
/**
* 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器
* @param binder
*/
@InitBinder
public void initBinder(WebDataBinder binder)
/**
* 把值绑定到Model中,使全局@RequestMapping可以获取到该值
* @param model
*/
@ModelAttribute
public void addAttributes(Model model)
model.addAttribute("author", "Magical Sam");
/**
* 全局异常捕捉处理
* @param ex
* @return
*/
@ResponseBody
@ExceptionHandler(value = Exception.class)
public Map errorHandler(Exception ex)
Map map = new HashMap();
map.put("code", 100);
map.put("msg", ex.getMessage());
return map;
启动应用后,被 @ExceptionHandler、@InitBinder、@ModelAttribute 注解的方法,都会作用在 被 @RequestMapping 注解的方法上。
@ModelAttribute:在Model上设置的值,对于所有被 @RequestMapping 注解的方法中,都可以通过 ModelMap 获取,如下:
@RequestMapping("/home")
public String home(ModelMap modelMap)
System.out.println(modelMap.get("author"));
//或者 通过@ModelAttribute获取
@RequestMapping("/home")
public String home(@ModelAttribute("author") String author)
System.out.println(author);
@ExceptionHandler 拦截了异常,我们可以通过该注解实现自定义异常处理。其中,@ExceptionHandler 配置的 value 指定需要拦截的异常类型,上面拦截了 Exception.class 这种异常。
二、自定义异常处理(全局异常处理)
spring boot 默认情况下会映射到 /error 进行异常处理,但是提示并不十分友好,下面自定义异常处理,提供友好展示。
1、编写自定义异常类:
package com.sam.demo.custom;
/**
* @author sam
* @since 2017/7/17
*/
public class MyException extends RuntimeException
public MyException(String code, String msg)
this.code = code;
this.msg = msg;
private String code;
private String msg;
// getter & setter
注:spring 对于 RuntimeException 异常才会进行事务回滚。
2、编写全局异常处理类
创建 MyControllerAdvice.java,如下:
package com.sam.demo.controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
/**
* controller 增强器
*
* @author sam
* @since 2017/7/17
*/
@ControllerAdvice
public class MyControllerAdvice
/**
* 全局异常捕捉处理
* @param ex
* @return
*/
@ResponseBody
@ExceptionHandler(value = Exception.class)
public Map errorHandler(Exception ex)
Map map = new HashMap();
map.put("code", 100);
map.put("msg", ex.getMessage());
return map;
/**
* 拦截捕捉自定义异常 MyException.class
* @param ex
* @return
*/
@ResponseBody
@ExceptionHandler(value = MyException.class)
public Map myErrorHandler(MyException ex)
Map map = new HashMap();
map.put("code", ex.getCode());
map.put("msg", ex.getMsg());
return map;
3、controller中抛出异常进行测试。
@RequestMapping("/home")
public String home() throws Exception
// throw new Exception("Sam 错误");
throw new MyException("101", "Sam 错误");
启动应用,访问:http://localhost:8080/home ,正常显示以下json内容,证明自定义异常已经成功被拦截。
"msg":"Sam 错误","code":"101"
* 如果不需要返回json数据,而要渲染某个页面模板返回给浏览器,那么MyControllerAdvice中可以这么实现:
@ExceptionHandler(value = MyException.class)
public ModelAndView myErrorHandler(MyException ex)
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("error");
modelAndView.addObject("code", ex.getCode());
modelAndView.addObject("msg", ex.getMsg());
return modelAndView;
在 templates 目录下,添加 error.ftl(这里使用freemarker) 进行渲染:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>错误页面</title>
</head>
<body>
<h1>$code</h1>
<h1>$msg</h1>
</body>
</html>
重启应用,http://localhost:8080/home 显示自定的错误页面内容。
补充:如果全部异常处理返回json,那么可以使用 @RestControllerAdvice 代替 @ControllerAdvice ,这样在方法上就可以不需要添加 @ResponseBody。
@controlleradvice拦截异常并统一处理(代码片段)
在spring3.2中,新增了@ControllerAdvice注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。参考:@ControllerAdvice文档一、介绍创建MyControllerAdvice,并添加@ControllerAdvice注解。packagecom.sam 查看详情
springboot-@controlleradvice拦截异常并统一处理
SpringBoot是为了简化Spring应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个WEB工程 ... 查看详情
spring的@exceptionhandler和@controlleradvice统一处理异常
之前敲代码的时候,避免不了各种try..catch,如果业务复杂一点,就会发现全都是try…catchtry..........catch(Exception1e)..........catch(Exception2e)...........catch(Exception3e)...........这样其实代码既不简洁好看,我们敲着也烦,一般我们可能想到用... 查看详情
springboot2系列教程(十四)|统一异常处理
...的。SpringBoot中的全局异常处理主要起作用的两个注解是@ControllerAdvice和@ExceptionHandler,其中@ControllerAdvice是组件注解,添加了这个注解的类能够拦截Controller的请求,而ExceptionHandler注解可以设置全局处理控制里的异常类型来拦截要... 查看详情
@restcontrolleradvice作用及原理(代码片段)
原文:SpringBoot系列(八)@ControllerAdvice拦截异常并统一处理在spring3.2中,新增了@ControllerAdvice注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。参考:@ControllerAdvice文档一、介绍创建MyControll... 查看详情
springboot统一功能处理(用户登录权限效验-拦截器异常处理数据格式返回)(代码片段)
...理3.统一数据格式返回3.1统一数据格式返回的实现3.2@ControllerAdvice源码分析本篇将要学习SpringBoot统一功能处理模块,这也是AOP的实战环节统一用户登录权限的效验实现接口HandlerInterceptor+WebMvcConfigurer统一异常处理使用注... 查看详情
@controlleradvice自定义异常统一处理(代码片段)
...户的某些操作不被允许,需要给用户提示。Spring提供了@ControllerAdvice这个注解,这个注解可以实现全局异常处理,全局数据绑定,全局数据预处理,这里主要说下使用这个注解实现全局异常处理。1.定义我们自己的业务异常ErrorCod... 查看详情
java项目构建基础之统一异常
统一异常处理@ControllerAdvice该注解为统一异常处理的核心是一种作用于控制层的切面通知(Advice),该注解能够将通用的@ExceptionHandler、@InitBinder和@ModelAttributes方法收集到一个类型,并应用到所有控制器上该类中的设计思路:使... 查看详情
springboot(十九)@controlleradvice+@exceptionhandler全局捕获controller异常
在spring3.2中,新增了@ControllerAdvice注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。@ControllerAdvice官方文档。创建全局异常处理类:通过使用@ControllerAdvice定义统一的异常处理类,而不是在... 查看详情
springboot项目中,异常拦截
SpringBoot自带异常拦截@ControllerAdvice1.创建一个SellerExceptionHandler类打上@ControllerAdvice标签@ControllerAdvicepublicclassSellExceptionHandler{}2.创建异常处理程序@ExceptionHandler(value=SellerAuthorizeException.class)表示 查看详情
统一异常处理@controlleradvice+@exceptionhandler全局处理controller层异常(代码片段)
1.利用springmvc注解对Controller层异常全局处理对于与数据库相关的SpringMVC项目,我们通常会把事务配置在Service层,当数据库操作失败时让Service层抛出运行时异常,Spring事物管理器就会进行回滚。如此一来,我们的Controller层就不得... 查看详情
@restcontrolleradvice全局拦截异常(代码片段)
在spring3.2中,新增了@ControllerAdvice注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。/***全局异常处理器**@author*/@RestControllerAdvicepublicclassGlobalExceptionHandlerprivatestatic 查看详情
springboot的四种拦截机制
...。过滤器(filter)拦截器(interceptor)全局异常处理器(ControllerAdvice)切片(aspect)如上图所示,当一个请求发送来的时候,filter在最外层,也最先拦截到请求,接下来就是interceptor,依次是ControllerAdvice(处理controller层异常)... 查看详情
谷粒商城-品牌管理-统一异常处理(代码片段)
...异常处理类 对于项目中出现的异常,我们通常采用ControllerAdvice的方式进行统一处理,简化代码。1)、编写异常处理类,使用@ControllerAdvice。2)、使用@ExceptionHandler标注方法可以处理的异常。packagecom.xxh.... 查看详情
restful接口调用统一异常处理(代码片段)
...,可对controller中被@RequestMapping注解的方法加一些逻辑处理@ControllerAdvice//异常定义@ExceptionHandler//返回格式为json,可以使用@RestControllerAdvice代替@ControllerAdvice,这样在方法上就可以不需要添加@ResponseBody@Respons 查看详情
在 WebFilter 类中抛出异常并在 ControllerAdvice 类中处理它
】在WebFilter类中抛出异常并在ControllerAdvice类中处理它【英文标题】:ThrowanexceptioninaWebFilterclassandhandleitinaControllerAdviceclass【发布时间】:2018-11-0515:02:18【问题描述】:我正在尝试实现一个WebFilter来检查JWT,如果检查失败或结果无... 查看详情
springboot统一功能处理(代码片段)
...一数据返回格式?3.2统一数据返回格式的实现3.3@ControllerAdvice源码分析(了解)前言接下来是SpringBoot统⼀功能处理模块了,也是AOP的实战环节,要实现的课程⽬标有以下3个:统⼀⽤户登录权限验证统⼀... 查看详情
zuul实现模块异常统一拦截返回(代码片段)
参考地址:https://www.cnblogs.com/linjiqin/p/10202085.htmlzuul网关中根据过滤器的生命周期有以下类型的过滤器:a、pre: 这种过滤器在请求被路由之前调用。可利用这种过滤器实现身份验证、在集群中选择请求的微服务,记录调试信息... 查看详情