@RequestMapping属性详解及案例演示

@RequestMapping源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {String name() default "";@AliasFor("path")String[] value() default {};@AliasFor("value")String[] path() default {};RequestMethod[] method() default {};String[] params() default {};String[] headers() default {};String[] consumes() default {};String[] produces() default {};}

 通过 @RequestMapping 源码,我们得知可以配置以下属性:

  • name
  • value(path)
  • method
  • params
  • headers
  • consumes
  • produces

name

映射的名称

名称可以指定也可以不指定,规则如下:

  • 指定:配置的映射名
  • 未指定:类名中的大写字母 + # + 方法名
效果演示
创建Controller
@RestController
@RequestMapping("/mapping")
public class MappingController {@GetMapping(value = "/default_name")public String defaultName() {return "default_name";}@GetMapping(value = "/custom_name", name = "MappingController#customName")public String customName() {return "custom_name";}}
AbstractHandlerMethodMapping#lookupHandlerMethod

value(path)

请求路径

如果类和方法上都存在 @RequestMapping 注解,请求路径 = 类上配置的path + 方法上配置的path

配置多个请求路径

我们可以让多个请求路径,映射到同一个接口方法

案例演示
@GetMapping(value = {"/p1", "/p2"})
public String multiPath() {return "multiPath";
}

添加前缀

我们也可以添加配置,使得特定 Controller 的请求路径需要添加前缀,这时候 请求路径 = 前缀类上配置的path + 方法上配置的path

案例演示
创建配置类
@Configuration
public class MappingConfig implements WebMvcConfigurer {@Overridepublic void configurePathMatch(PathMatchConfigurer configurer) {configurer.addPathPrefix("/custom", type -> type.isAssignableFrom(MappingController.class));}
}
请求 /mapping/p1 抛出 404 异常

请求 /custom/mapping/p2 正常映射

支持Spel表达式
创建 keys.properties
key=a
引用keys.properties
@SpringBootApplication
@PropertySource("classpath:keys.properties")
public class BootApplication {public static void main(String[] args) {SpringApplication.run(BootApplication.class);}
}
 接口及响应
@GetMapping(value = {"${key}"})
public String spel() {return "spel";
}

method

请求方法

@GetMapping@PostMapping@PutMapping@DeleteMapping 等注解都是 @RequestMapping 注解的封装

  • @GetMapping ==> @RequestMapping(method = RequestMethod.GET)
  • @PostMapping ==> @RequestMapping(method = RequestMethod.POST)
  • @PutMapping ==> @RequestMapping(method = RequestMethod.PUT)
  • @DeleteMapping ==> @RequestMapping(method = RequestMethod.DELETE)

params

The parameters of the mapped request, narrowing the primary mapping.
Same format for any environment: a sequence of "myParam=myValue" style expressions, with a request only mapped if each such parameter is found to have the given value. Expressions can be negated by using the "!=" operator, as in "myParam!=myValue". "myParam" style expressions are also supported, with such parameters having to be present in the request (allowed to have any value). Finally, "!myParam" style expressions indicate that the specified parameter is not supposed to be present in the request.

通过注释,我们得知 Expressions 大概有以下四种形式:

  • myParam=myValue : 某个参数的值等于指定value
  • myParam!=myValue: 某个参数的值不等于指定value
  • myParam : 存在参数myParam
  • !myParam : 不存在参数myParam
案例演示
myParam=myValue
接口及响应
@GetMapping(value = "equal_value", params = {"key=1"})
public String equalValue() {return "equal value";
}
key 不存在

key 为 2

key 为 1 

key 不存在或者 value 不等于指定值则抛出异常

myParam!=myValue
接口及响应
@GetMapping(value = "not_equal_value", params = {"key!=1"})
public String notEqualValue() {return "not equal value";
}
key 不存在

key 为 2

key 为 1

key 不存在或者 value 不等于指定值正常映射,否则抛出异常

myParam
接口及响应
@GetMapping(value = "exist", params = {"key"})
public String exist() {return "exist";
}
key 为 null 

key 为 1 

key 不存在 

只要指定 key 存在就可以正常映射,不管是不是为 null

!myParam
接口及响应
@GetMapping(value = "absent", params = {"!key"})
public String absent() {return "absent";
}
 key 为 null

key 为 1

key 不存在 

只要指定 key 存在就抛出异常,不管是不是为 null

headers

The headers of the mapped request, narrowing the primary mapping.
Same format for any environment: a sequence of "My-Header=myValue" style expressions, with a request only mapped if each such header is found to have the given value. Expressions can be negated by using the "!=" operator, as in "My-Header!=myValue". "My-Header" style expressions are also supported, with such headers having to be present in the request (allowed to have any value). Finally, "!My-Header" style expressions indicate that the specified header is not supposed to be present in the request.

和 params 类似,headers也有四种形式

  • My-Header=myValue
  • My-Header!=myValue
  • My-Header
  • !My-Header

和 params 用法基本一致,这里就演示一个案例,不过多举例

案例演示
My-Header=myValue
接口及响应
@GetMapping(value = "headers", headers = {"Custom-Header=66"})
public String headers() {return "headers";
}

consumes

Content-Type 的值必须满足 consumes(如果不为空数组) 指定的多个值(或取反)之一

案例演示
接口及响应
@GetMapping(value = "consumes", consumes = {"text/plain", "application/json"})
public String consumes() {return "consumes";
}

PS : 如果 headers 已经对 Content-Type  进行了限制,consumes 失效

produces

Accept 的值必须满足(兼容) produces(如果不为空数组) 指定的多个值(或取反)之一

案例演示
接口及响应
@GetMapping(value = "produces", produces = {"text/plain", "application/json"})
public String produces() {return "produces";
}

PS : 如果 headers 已经对 Accept  进行了限制,produces 失效

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

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

相关文章

智能写作与痕迹消除:AI在创意文案和论文去痕中的应用

作为一名AI爱好者,我积累了许多实用的AI生成工具。今天,我想分享一些我经常使用的工具,这些工具不仅能帮助提升工作效率,还能激发创意思维。 我们都知道,随着技术的进步,AI生成工具已经变得越来越智能&…

简单分享 for循环,从基础到高级

1. 基础篇:Hello, For Loop! 想象一下,你想给班上的每位同学发送“Hello!”,怎么办?那就是for循环啦, eg:首先有个名字的列表,for循环取出,分别打印 names ["Alice", …

bigNumber的部分使用方法与属性

场景:最近做IoT项目的时候碰到一个问题,涉及到双精度浮点型的数据范围的校验问题。业务上其实有三种类型:int、float和double类型三种。他们的范围分别是: //int int: [-2147483648, 2147483647],//float float: [-3402823466385…

PHP7源码结构

PHP7程序的执行过程 1.PHP代码经过词法分析转换为有意义的Token; 2.Token经过语法分析生成AST(Abstract Synstract Syntax Tree,抽象语法树); 3.AST生成对应的opcode,被虚拟机执行。 源码结构&#xff1…

一切为了安全丨2024中国应急(消防)品牌巡展武汉站成功召开!

消防品牌巡展武汉站 6月28日,由中国安全产业协会指导,中国安全产业协会应急创新分会、应急救援产业网联合主办,湖北消防协会协办的“一切为了安全”2024年中国应急(消防)品牌巡展-武汉站成功举办。该巡展旨在展示中国应急(消防&am…

qt QTreeView的简单使用(多级子节点)

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);setWindowTitle("QTreeView的简单使用");model new QStandardItemModel;model->setHorizontalHeaderLabels(QStringList() << "left&q…

[leetcode]longest-arithmetic-subsequence-of-given-difference. 最长定差子序列

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int longestSubsequence(vector<int> &arr, int difference) {int ans 0;unordered_map<int, int> dp;for (int v: arr) {dp[v] dp[v - difference] 1;ans max(ans, dp[v]);}return ans…

Qt源码分析:窗体绘制与响应

作为一套开源跨平台的UI代码库&#xff0c;窗体绘制与响应自然是最为基本的功能。在前面的博文中&#xff0c;已就Qt中的元对象系统(反射机制)、事件循环等基础内容进行了分析&#xff0c;并捎带阐述了窗体响应相关的内容。因此&#xff0c;本文着重分析Qt中窗体绘制相关的内容…

如何完成域名解析验证

一&#xff1a;什么是DNS解析&#xff1a; DNS解析是互联网上将人类可读的域名&#xff08;如www.example.com&#xff09;转换为计算机可识别的IP地址&#xff08;如192.0.2.1&#xff09;的过程&#xff0c;大致遵循以下步骤&#xff1a; 查询本地缓存&#xff1a;当用户尝…

顺序串算法库构建

学习贺利坚老师顺序串算法库 数据结构之自建算法库——顺序串_创建顺序串s1,创建顺序串s2-CSDN博客 本人详细解析博客 串的概念及操作_串的基本操作-CSDN博客 版本更新日志 V1.0: 在贺利坚老师算法库指导下, 结合本人详细解析博客思路基础上,进行测试, 加入异常弹出信息 v1.0补…

已解决java.awt.geom.NoninvertibleTransformException:在Java2D中无法逆转的转换的正确解决方法,亲测有效!!!

已解决java.awt.geom.NoninvertibleTransformException&#xff1a;在Java2D中无法逆转的转换的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 1. 检查缩放因子 修改后的缩放变换 …

关键路径——C语言(理论)

关键路径&#xff0c;是项目网络中从起始事件到终止事件的最长路径&#xff0c;决定了项目的最短完成时间。 关键路径中的任务没有任何可调整的余地&#xff0c;如果任何一个任务被延迟&#xff0c;整个项目的完成时间也会被延迟。 假设我们现在有一个图&#xff1a;把图的边…

【CH32V305FBP6】USBD HS 虚拟串口分析

文章目录 前言分析端点 0USBHS_UIS_TOKEN_OUT 端点 2USBHS_UIS_TOKEN_OUTUSBHS_UIS_TOKEN_IN 前言 虚拟串口&#xff0c;端口 3 单向上报&#xff0c;端口 2 双向收发。 分析 端点 0 USBHS_UIS_TOKEN_OUT 设置串口参数&#xff1a; 判断 USBHS_SetupReqCode CDC_SET_LIN…

从零开始实现大语言模型(一):概述

1. 前言 大家好&#xff0c;我是何睿智。我现在在做大语言模型相关工作&#xff0c;我用业余时间写一个专栏&#xff0c;给大家讲讲如何从零开始实现大语言模型。 从零开始实现大语言模型是了解其原理及领域大语言模型实现路径的最好方法&#xff0c;没有之一。已有研究证明&…

Windows10录屏,教你3个方法,简单快速录屏

“我的电脑系统是Windows10的系统&#xff0c;今晚要进行线上开会&#xff0c;但我实在有事没办法参加会议&#xff0c;想把会议的内容录制下来方便我后续观看。但却找不到电脑录屏功能在哪里打开&#xff1f;求助一下&#xff0c;谁能帮帮我&#xff1f;” 在数字化时代&…

mysql 命令 —— 查看表信息(show table status)

查询表信息&#xff0c;如整个表的数据量大小、表的索引占用空间大小等 1、查询某个库下面的所有表信息&#xff1a; SHOW TABLE STATUS FROM your_database_name;2、查询指定的表信息&#xff1a; SHOW TABLE STATUS LIKE your_table_name;如&#xff1a;Data_length 显示表…

闲聊 .NET Standard

前言 有时候&#xff0c;我们从 Nuget 下载第三方包时&#xff0c;会看到这些包的依赖除了要求 .NET FrameWork、.NET Core 等的版本之外&#xff0c;还会要求 .NET Standard 的版本&#xff0c;比如这样&#xff1a; 这个神秘的 .NET Standard 是什么呢&#xff1f; .NET St…

从零开始搭建spring boot多模块项目

一、搭建父级模块 1、打开idea,选择file–new–project 2、选择Spring Initializr,选择相关java版本,点击“Next” 3、填写父级模块信息 选择/填写group、artifact、type、language、packaging(后面需要修改)、java version(后面需要修改成和第2步中版本一致)。点击“…

工业触摸一体机优化MES应用开发流程

工业触摸一体机在现代工业生产中扮演着至关重要的角色&#xff0c;它集成了智能触摸屏和工业计算机的功能&#xff0c;广泛应用于各种生产场景中。而制造执行系统&#xff08;MES&#xff09;作为工业生产管理的重要工具&#xff0c;对于提高生产效率、降低成本、优化资源利用具…

力扣hot100-普通数组

文章目录 题目&#xff1a;最大子数组和方法1 动态规划方法2 题目&#xff1a;合并区间题解 题目&#xff1a;最大子数组和 原题链接&#xff1a;最大子数组和 方法1 动态规划 public class T53 {//动态规划public static int maxSubArray(int[] nums) {if (nums.length 0…