@RequestMapping属性详解及案例演示

news2024/10/6 19:28:39

@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 {

    @Override
    public 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.coloradmin.cn/o/1885997.html

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

相关文章

最快33天录用!一投就中的医学4区SCI,几乎不退稿~

【SciencePub学术】今天小编给大家推荐2本生物医学领域的SCI,此期刊为我处目前合作的重点期刊!影响因子0-3.0之间,最重要的是审稿周期较短,对急投的学者较为友好! 医学医药类SCI 01 / 期刊概况 【期刊简介】IF&…

从0开始搭建vue项目

#先查下电脑有没有安装过node和npm node -v npm -v #安装vue npm install -g vue #安装webpack npm install webpack -g 都安装好后&#xff0c;进入你想创建的文件夹内 创建名字&#xff1a;vue init webpack <project_name> 就默认回车 然后根据项目需求Y/n 比如…

红酒香气探秘:解锁品味酒香的奥秘,带你领略葡萄酒的魅力

在葡萄酒的世界里&#xff0c;香气是葡萄酒的灵魂&#xff0c;它诉说着葡萄的故事&#xff0c;也展现着酿酒师的匠心独运。每一款红酒都有其不同的香气&#xff0c;如同一位优雅的舞者&#xff0c;用曼妙的舞姿诠释着酒的韵味。今天&#xff0c;就让我们一起走进红酒的香气世界…

24年诺瓦星云入职认知能力测验Verify + 职业性格问卷OPQ可搜索带解析求职SHL题库

一、走进西安诺瓦星云科技股份有限公司 西安诺瓦星云科技股份有限公司(简称诺瓦星云) 是全球极具竞争力的LED显示解决方案供应商&#xff0c;实施"基于西安&#xff0c;围绕北京与深圳&#xff0c;辐射全球"的全球化布局&#xff0c;总部位于西安&#xff0c;西安、…

微服务中的Feign远程调用

Feign的个人理解 Feign在英文中是“装”的意思&#xff0c;但在微服务中他是远程调用的一种方式&#xff0c;我的理解是&#xff1a;他替代了RestTemplateNacos中的URL编码的方式&#xff0c;显得很高大上&#xff0c;所以很装&#xff1a;&#xff08;声明式事务&#xff0c;只…

静态IP代理:保障网络稳定的核心技术

静态IP代理作为一种重要的网络工具&#xff0c;因其稳定性和持久性&#xff0c;受到越来越多用户的青睐。本文将深入探讨静态IP代理的定义和优势。 静态IP代理是什么&#xff1f; 静态IP代理是指在代理服务器中分配一个固定的IP地址&#xff0c;用户在使用过程中始终使用同一个…

当我问AI,智星云算力有什么特点时,答案出乎意料!

当我问AI&#xff0c;智星云算力有什么特点时&#xff0c;它的回答几乎全中。 唯一的错误是在“分钟计费”这里&#xff0c;之前确实是按分钟计费过&#xff0c;今年改成了按小时计费&#xff0c;大约一小时0.75元起。 另外就是一些更具体的特点没有展现出来&#xff0c;比如…

Mysql和ES使用汇总

一、mysql和ES在业务上的配合使用 一般使用时使用ES 中存储全文检索的关键字与获取的商品详情的id&#xff0c;通过ES查询获取查询商品的列表中展示的数据&#xff0c;通过展示id 操作去获取展示商品的所有信息。mysql根据id去查询数据库数据是很快的&#xff1b; 为什么ES一般…

高效除氟:探索CH-87up树脂在氟化工废水处理中的应用

摘要 本研究旨在评估Tulsimer CH-87up树脂针对经钙镁预处理后的氟化工废水的深度处理效果。实验结果显示&#xff0c;CH-87up树脂能显著降低废水中的氟离子浓度&#xff0c;从43.4mg/L降至0.34mg/L&#xff0c;远低于行业排放标准的5mg/L。此外&#xff0c;该树脂表现出卓越的…

Windows打开redis以及Springboot整合redis

目录 前言Windows系统打开redisSpringboot整合redis依赖实体类yml配置文件config配置各个数据存储类型分别说明记录string数据写入redis&#xff0c;并查询通过命令行查询 list插入数据到redis中从redis中读取命令读取数据 hash向redis中逐个添加map键值对获取key对应的map中所…

[附源码]最新springboot线上电商|前后端分离|界面简洁

一. 前言 今天小编给大家带来了一款可学习&#xff0c;可商用的&#xff0c;线上电商的网站源码&#xff0c;支持二开&#xff0c;无加密。代码的后端是SpringBoot技术栈&#xff08;非jsp&#xff09;&#xff0c;前端是Angular。如果您需要定制需求请找小编。 文章第六小节…

Vue 数据大屏适配

1、准备俩个盒子 .dataScreen-content 盒子内容根据设计稿给的px单位进行正常的布局就行 2、盒子的CSS样式 .dataScreen-container {width: 100%;height: 100%;// 有背景图需要的样式background: url("./images/bg.png") no-repeat;background-repeat: no-repeat;b…

让采购和工程师们既爱又恨的任务——BOM

在项目研发与生产过程中&#xff0c;有一个常常让采购经理和工程师们既爱又恨的任务&#xff0c;那就是整理BBOMB。BOM作为连接设计与制造的桥梁&#xff0c;其重要性不言而喻&#xff0c;它详细列出了产品构成所需的所有零部件、材料及其规格、数量&#xff0c;是成本估算、采…

学习记录之数学表达式(6)

目录 十二、图与网络12.1 有向图12.2 元组与对象12.3 二元关系与有向图12.4 无向图12.5 有向网络12.6 作业 十三、树13.1 例子13.2 定义13.3 Java代码13.4 作业 十四、 m \mathbf{m} m叉树14.1 预备知识&#xff1a;字符串14.2 m \mathbf{m} m-叉树的定义14.3 Java代码14.4 作…

代码随想录算法训练营第20天 | 题目: 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

代码随想录算法训练营第20天 | 题目&#xff1a; 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点 文章来源&#xff1a;代码随想录 题目名称&#xff1a; 235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的…

【.Net】Web项目部署腾讯云

文章目录 总述前置准备docker-compose部署普通部署 参考 总述 前置准备 云服务添加端口 另有linux本身防火墙请参考&#xff1a; 【Linux】防火墙命令 需安装.Net SDK和Asp .Net Runtime 注意&#xff1a; 1、sdk也要不只是runtime 2、是Asp .Net Runtime不是.Net Runtime …

Linux socketcan应用编程

一、基本步骤 1、打开并绑定到 CAN 套接字 在执行任何操作之前&#xff0c;第一步是创建一个套接字。此函数接受三个参数 – 域/协议系列 &#xff08;PF_CAN&#xff09;、套接字类型&#xff08;原始或数据报&#xff09;和套接字协议。如果成功&#xff0c;该函数将返回文件…

游戏AI的创造思路-技术基础-tanh函数详解

又来搞事情&#xff0c;总想着把sigmoid函数替换成其他函数作为激活函数&#xff0c;或者找到更合适某一段训练的函数&#xff0c;所以今天来聊聊tanh函数&#xff08;谁让咱当年差点去了数学系&#xff0c;结果还是在数学系转过去计算机的&#xff09; 目录 3.9. tanh函数详解…

Springboot整合Redis以及业务工具类示例

docker安装Redis参考我另一篇博客Docker安装Redis及持久化 一、Get-Started 依赖 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --> <dependency><groupId>org.springframework.boot</groupId>…

轻松创建对象——简单工厂模式(Python实现)

1. 引言 大家好&#xff0c;又见面了&#xff01;今天我们要聊的是设计模式中的“万能钥匙”——简单工厂模式。想象一下&#xff0c;如果每次你都得亲自动手创建各种对象&#xff0c;不仅累得像个陀螺&#xff0c;还可能搞得一团糟。别怕&#xff0c;简单工厂模式来拯救你&am…