@controlleradvice拦截异常并统一处理(代码片段)

leeindex leeindex     2022-10-28     404

关键词:

在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: 这种过滤器在请求被路由之前调用。可利用这种过滤器实现身份验证、在集群中选择请求的微服务,记录调试信息... 查看详情