@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", …

Apache APISIX 介绍

Apache APISIX 是一个动态、实时、高性能的云原生API网关,属于Apache软件基金会旗下的项目。以下是对Apache APISIX的详细介绍: 一、基本概述 定义:Apache APISIX是一个提供丰富流量管理功能的云原生API网关。功能:包括负载均衡…

git出现Permission denied问题

Warning: Permanently added ‘icode.baidu.com,10.11.81.103’ (RSA) to the list of known hosts. Permission denied (baas,keyboard-interactive,publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the…

nodejs操作excel文件实例,读取sheets, 设置cell颜色

本代码是我帮客户做的兼职的实例,涉及用node读取excel文件,遍历sheets,给单元格设置颜色等操作,希望对大家接活有所帮助。 gen.js let dir"D:\\武汉烟厂\\山东区域\\备档资料\\销区零售终端APP维护清单\\走访档案\\2024年6月…

Spring之事务失效的场景

Spring事务失效的场景 异常捕获处理:自己处理了异常,没有抛出。解决:手动抛出抛出检查异常:配置rollbackFor属性为Excetion非public方法导致事务失效,改为public 1、异常捕获处理 示例: 张三1000元&#…

7月形势分析-您下一步该如何做,才能走出困境?

马上工程项目,再有三五天就要结束的了。即便推后也不会超过一周时间了。所以需要考虑将来干啥呢?  一方面就是继续去济宁做建筑工程的活。管吃住,但是因为至亲之间,难免咋说呢,总之还是不太舒服的样子。管事情多&…

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…

【数据结构 - 时间复杂度和空间复杂度】

文章目录 <center>时间复杂度和空间复杂度算法的复杂度时间复杂度大O的渐进表示法常见时间复杂度计算举例 空间复杂度实例 时间复杂度和空间复杂度 算法的复杂度 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏&…

[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中窗体绘制相关的内容…

ECharts 快速入门

文章目录 1. 引入 ECharts2. 初始化 ECharts 实例3. 配置图表选项4. 使用配置项生成图表5. 最常用的几种图形5.1 柱状图&#xff08;Bar Chart&#xff09;5.2 折线图&#xff08;Line Chart&#xff09;5.3 饼图&#xff08;Pie Chart&#xff09;5.4 散点图&#xff08;Scatt…

如何完成域名解析验证

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

Linux内核 -- 多线程之完成量completion的使用

Linux Kernel Completion 使用指南 在Linux内核编程中&#xff0c;completion是一个用于进程同步的机制&#xff0c;常用于等待某个事件的完成。它提供了一种简单的方式&#xff0c;让一个线程等待另一个线程完成某项任务。 基本使用方法 初始化 completion结构需要在使用之…

顺序串算法库构建

学习贺利坚老师顺序串算法库 数据结构之自建算法库——顺序串_创建顺序串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;把图的边…