exceptionhandler注解_SpringMVC 中 @ControllerAdvice 注解的三种使用场景!

@ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller。使用这个 Controller ,可以实现三个方面的功能:

  1. 全局异常处理

  2. 全局数据绑定

  3. 全局数据预处理

灵活使用这三个功能,可以帮助我们简化很多工作,需要注意的是,这是 SpringMVC 提供的功能,在 Spring Boot 中可以直接使用,下面分别来看。

全局异常处理

使用 @ControllerAdvice 实现全局异常处理,只需要定义类,添加该注解即可定义方式如下:

@ControllerAdvice

public class MyGlobalExceptionHandler {

@ExceptionHandler(Exception.class)

public ModelAndView customException(Exception e) {

ModelAndView mv = new ModelAndView();

mv.addObject("message", e.getMessage());

mv.setViewName("myerror");

return mv;

}

}

在该类中,可以定义多个方法,不同的方法处理不同的异常,例如专门处理空指针的方法、专门处理数组越界的方法...,也可以直接向上面代码一样,在一个方法中处理所有的异常信息。

@ExceptionHandler 注解用来指明异常的处理类型,即如果这里指定为 NullpointerException,则数组越界异常就不会进到这个方法中来。

全局数据绑定

全局数据绑定功能可以用来做一些初始化的数据操作,我们可以将一些公共的数据定义在添加了 @ControllerAdvice 注解的类中,这样,在每一个 Controller 的接口中,就都能够访问导致这些数据。

使用步骤,首先定义全局数据,如下:

@ControllerAdvice

public class MyGlobalExceptionHandler {

@ModelAttribute(name = "md")

public Map<String,Object> mydata() {

HashMap<String, Object> map = new HashMap<>();

map.put("age", 99);

map.put("gender", "男");

return map;

}

}

使用 @ModelAttribute 注解标记该方法的返回数据是一个全局数据,默认情况下,这个全局数据的 key 就是返回的变量名,value 就是方法返回值,当然开发者可以通过 @ModelAttribute 注解的 name 属性去重新指定 key。

定义完成后,在任何一个Controller 的接口中,都可以获取到这里定义的数据:

@RestController

public class HelloController {

@GetMapping("/hello")

public String hello(Model model) {

Map<String, Object> map = model.asMap();

System.out.println(map);

int i = 1 / 0;

return "hello controller advice";

}

}

全局数据预处理

考虑我有两个实体类,Book 和 Author,分别定义如下:

public class Book {

private String name;

private Long price;

//getter/setter

}

public class Author {

private String name;

private Integer age;

//getter/setter

}

此时,如果我定义一个数据添加接口,如下:

@PostMapping("/book")

public void addBook(Book book, Author author) {

System.out.println(book);

System.out.println(author);

}

这个时候,添加操作就会有问题,因为两个实体类都有一个 name 属性,从前端传递时 ,无法区分。此时,通过 @ControllerAdvice 的全局数据预处理可以解决这个问题

解决步骤如下:

1.给接口中的变量取别名

@PostMapping("/book")

public void addBook(@ModelAttribute("b") Book book, @ModelAttribute("a") Author author) {

System.out.println(book);

System.out.println(author);

}

2.进行请求数据预处理
在 @ControllerAdvice 标记的类中添加如下代码:

@InitBinder("b")

public void b(WebDataBinder binder) {

binder.setFieldDefaultPrefix("b.");

}

@InitBinder("a")

public void a(WebDataBinder binder) {

binder.setFieldDefaultPrefix("a.");

}

@InitBinder("b") 注解表示该方法用来处理和Book和相关的参数,在方法中,给参数添加一个 b 前缀,即请求参数要有b前缀.

3.发送请求

请求发送时,通过给不同对象的参数添加不同的前缀,可以实现参数的区分.

0c4a0821a5e417c6135f525fa0328b90.png

总结

这就是松哥给大伙介绍的 @ControllerAdvice 的几个简单用法,这些点既可以在传统的 SSM 项目中使用,也可以在 Spring Boot + Spring Cloud 微服务中使用,欢迎大家有问题一起讨论。

2e540de4c8fb102f289737cedb04199a.gifd64b334d54ab6feedad028542cc52ac6.png关注牧码小子,后台回复 Java ,领取松哥为你精心准备的Java干货!2e540de4c8fb102f289737cedb04199a.gif

往期文章一览

1、推荐一个技术圈子,Java技能提升就靠它了

2、Spring Cloud 教程合集

3、Redis教程

4、MongoDB教程合集

5、Git教程合集

a099411ebec9c2cdeacdb284e22f03c2.png你点的每个在看,我都认真当成了喜欢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在家做科研是一种什么样的体验?

匿名提问&#xff1a;题主是 MSRA 的一名实习生&#xff0c;大四。在家咸鱼了半个月&#xff0c;这周打算督促自己继续科研&#xff01;&#xff08;再不火力全开对不起公司不停发的工资和房补&#xff09;。可是在家里似乎很难静下心读 paper&#xff0c;工作五分钟就可以奖励…

word List36

word List36 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

C++实现链式存储二叉树

#include <iostream> using namespace std; typedef char ElemType;typedef struct BiNode {//节点的创建ElemType data;struct BiNode *lchild, *rchild; } BiNode, *BiTree;void PreOrderTraverse(BiTree T) {//先序遍历if (T) {cout << T->data;PreOrderTrav…

37岁跳槽去阿里 p8_36岁阿里p8发帖:手下12个p7,17个p6,亲自写代码毫无中年危机...

关注微信公众号【程序员干货站】&#xff0c;可加入技术交流群~程序员热议的“35 岁中年危机”&#xff0c;其实很多人都没搞懂本质上是因为什么而焦虑。最近看脉脉上有阿里员工发帖称&#xff1a;“今年36岁&#xff0c;p8&#xff0c;手下29个人&#xff0c;12个p7,17个p6&am…

数据结构---判断一棵树是否是二叉搜索树

数据结构—判断一棵树是否是二叉搜索树 代码&#xff1a; #pragma once #define N 100 #define elemType BTree* #include<stdlib.h> typedef struct BTree {int data;struct BTree *lchild, *rchild; }BTree; typedef struct dQueue {elemType data;struct dQueue* ne…

【要闻】Kubernetes安全问题严峻、Linux v5.4安全性浅谈

以下为您奉上今天的开源领域要闻。谷歌提前发布Android 11首个开发者预览版谷歌通常会在三月推出即将发布的Android预览版本。但谷歌今年更早实现了该功能&#xff0c;现已发布了Android 11首个开发者预览版&#xff0c;目前仅支持部分Pixel手机。今年的重点是开发人员部分&…

旧键盘

题目背景 小明的键盘使用年限长&#xff0c;输入时键盘的按键时不时会有粘滞。出现粘滞情况时&#xff0c;上一个被按下的按键会被长按&#xff0c;而字符可能被输入一次或多次。 题目描述 给出小明将要输入的字符串s&#xff0c;和小明实际输入的字符串t&#xff0c;请你判断…

mac vim python3_VIM学习笔记 编译源码(Compile Code)-Python

Python作为一种解释型编程语言&#xff0c;需要解释器来编译并执行Python代码。测试Python对于Linux和Mac操作系统&#xff0c;均已预装Python。而在Windows下&#xff0c;可以使用安装包或者直接解压版zip文件。使用以下命令&#xff0c;可以查看当前Python版本&#xff1a;$ …

word List37

word List37 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

EntityFramework Core 3.x初级篇发布

之前陆陆续续有一些童鞋一直催我什么时候出EF Core视频&#xff0c;因个人时间确实有限&#xff0c;中间也一直有想法去录制&#xff0c;但是还是因为各种原因而难产&#xff0c;刚好最近因为疫情的事情&#xff0c;个人时间比较充裕&#xff0c;于是下定决心开始准备录制EF Co…

对pca降维后的手写体数字图片数据分类_机器学习:数据的准备和探索——特征提取和降维...

在数据的预处理阶段&#xff0c;特征提取和数据降维是提升模型表示能力的一种重要手段。特征提取主要是从数据中找到有用的特征&#xff0c;用于提升模型的表示能力&#xff0c;而数据降维主要是在不减少模型准确率的情况下减少数据的特征数量。比如&#xff0c;我们要搭建一个…

程序员应对浏览器同源策略的姿势

同源策略浏览器最基本的安全规范——同源策略(Same-Origin Policy)。所谓同源是指域名、协议、端口相同。不同源的浏览器脚本(javascript、ActionScript、canvas)在没明确授权的情况下&#xff0c;不能读写对方的资源。同源策略规定了浏览器脚本互操作web数据的基本原则&#x…

word List38

word List38 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

.net core 整洁架构入门

Clean Architecture with .NET Core: Getting Started&#xff03; 使用.NET Core整洁架构(Clean Architecture)&#xff1a;入门Over the past two years, I’ve travelled the world teaching programmers how to build enterprise applications using Clean Architecture wi…

算法---背包问题

算法—背包问题 参考&#xff1a;趣学算法 代码&#xff1a; typedef struct three {float w;float v;float p; }three; #define elemType three int quickSort1(elemType a[], int l, int h) {//快速排序int i l, j h;elemType p1 a[i];while (i < j) {while (i<j…

允许服务与桌面交互_在后全面屏时代 手机需要什么样的人机交互?

在智能手机进入全面屏时代之后&#xff0c;智能手机的屏占比已经越来越高&#xff0c;智能手机上的各种实体按键也已经越来越少&#xff0c;手机屏幕已经在客观上成为了用户进行交互操作的主要部件&#xff0c;而触控也全面取代了按键成为手机交互中最主要的方式。全面屏手机正…

C++实现链式存储线索二叉树

一颗线索二叉树&#xff1a; 根据下图进行节点的创建&#xff1a; 代码如下&#xff1a; #include <iostream> using namespace std; typedef char ElemType;typedef struct BiThrNode {ElemType data;int ltag,rtag;struct BiThrNode *lchild,*rchild; }BiThrNode,*Bi…

windows 仍在设置此设备的类配置。 (代码 56)_谷歌发布Flutter Alpha:支持Windows

老孟导读&#xff1a;Windows来了&#xff0c;Mac、Linux、Web还远吗&#xff1f; 本文翻译自https://medium.com/flutter/announcing-flutter-windows-alpha-33982cd0f433 我们的使命是为开发人员提供一个开源&#xff0c;高生产率的框架&#xff0c;以便在任何平台上构建漂亮…

word List39

word List39 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

不同路径 II-dp

题目背景 一个机器人位于一个 n x m 网格的左上角 机器人每次只能向下或者向右移动一步。它试图达到网格的右下角 题目描述 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径&#xff1f; 网格中的障碍物和空位置分别用 1 和 0 来表示。 输入格式 第一行两…