@RestController 源码解读:解决 Web 开发中 REST 服务的疑难杂症

目录

一、@RestContrller注解

1.1 查看底层源码

1.2 @AliasFor注解说明

1.2.1 注解别名

1.2.2 元数据别名

1.3 value() 方法的作用


一、@RestContrller注解

1.1 查看底层源码

首先编写如下内容:

@RestController
public class TestController {}

按住 Ctrl , 鼠标点击 @RestController 进入源码:

  1. @Target注解说明:查看底层源码发现
     

  2. @Documented:标明这个注解会包含在JavaDoc文档中

  3. @Retention:表示这个注解在运行时仍然有效,可以通过反射机制读取。


1.2 @AliasFor注解说明

@AliasFor是Spring框架的一个注解,用于声明注解属性的别名。它有两种不同的应用场景。

  • 注解内的别名

  • 元数据的别名

1.2.1 注解别名

查看@AliasFor注解源码:


 

通过该注解可以知道@AliasFor(value="xxx")和@AliasFor(attribute="xxx")的作用是相同的,接下来我们举例说明:

  1. 首先我需要自定义一个注解

    @Retention(value = RetentionPolicy.RUNTIME)
    @Documented
    @Target(ElementType.TYPE)
    public @interface MyInterface1 {String value1() default "";
    }

    当我们使用到该注解如 @MyInterface1(value1="number1"),表示 value1 的属性传入了 number1的值。现在如果自定义的注解改变为如下方式,但我希望通过 @MyInterface1(value2="number1") 达到上述相同的效果:

    @Retention(value = RetentionPolicy.RUNTIME)
    @Documented
    @Target(ElementType.TYPE)
    public @interface MyInterface1 {String value1() default "";String value2() default "";
    }

    就可以添加@Alias()注解为注解内方法(因为@Alias作用域是方法注解)起别名:

    @Retention(value = RetentionPolicy.RUNTIME)
    @Documented
    @Target(ElementType.TYPE)
    public @interface MyInterface1 {@AliasFor(value = "value2")String value1() default "";@AliasFor(value = "value1")String value2() default "";
    }

    达到 @MyInterface1(value2="number1") 和 @MyInterface1(value1="number1") 的效果相同。

注意事项:

  1. 组成别名对的每个属性都必须加上注释 @AliasFor,attribute()或value() 属性必须引用该对中另一个属性
  2. 别名属性必须声明相同的返回类型
  3. 别名属性必须声明一个默认值
  4. 别名属性必须声明相同的默认值

1.2.2 元数据别名

  1. 自定义第一个注解:

    @Retention(value = RetentionPolicy.RUNTIME)
    @Documented
    @Target(ElementType.TYPE)
    public @interface MyInterface1 {String value() default "";
    }

  2. 自定义第二个注解:

    @Retention(value = RetentionPolicy.RUNTIME)
    @Documented
    @Target(ElementType.TYPE)
    @MyInterface1
    public @interface MyInterface2 {@AliasFor(annotation = MyInterface1.class,value = "value")String value() default "";
    }

    此时@MyInterface1 (“number”)就和@MyInterface2(“number”)等价。这里可以理解成,注解MyInterface2的value属性重写了注解MyInterface1的value属性,但重新的属性的返回类型必须相同。

    此时再来查看@RestController 的@Alias:

        @RestController(value="xxxx")和@Controller(value="xxx")等价。

类似的使用包括:

可以看出对于value这个属性来说,@Configuration注解中的值会重写@Component的value属性值,这有点像类之间的继承,子类可以重父类的方法。我们也可以将@Configuration注解看成@Component的子注解


1.3 value() 方法的作用

@RestController的定义中,value()方法使用@AliasFor注解将其与@Controllervalue属性关联起来。这意味着当在@RestController上使用value属性时,它实际上等同于在@Controller上使用value属性,用于指定控制器的基本路径等相关信息,例如@RestController("myControllerPath")这种用法

也就是说value属性用于指定控制器的基本路径,那么我们进行接下来的测试:

  1. 首先编写Controller类代码:运行项目

    @RestController(value = "user")
    public class TestController {@RequestMapping("/test")public String test(){return "测试成功!";}}

    结果程序并没有识别到,发生404错误:

  2. 接下来测试/test路径:发现可以访问成功

  3. 所以如果是要填写路径的话,还是需要使用 @RequestMapping("/user/test")才是正确的,代码修改后测试:
    @RestController(value = "user")
    @RequestMapping("/user")
    public class TestController {@RequestMapping("/test")public String test(){return "测试成功!";}}

    此时就可以访问成功了:

  4. 一般情况下,我们修改为如下的规范:

    @RestController
    @RequestMapping("/user")
    public class TestController {@RequestMapping("/test")public String test(){return "测试成功!";}}

        所以value()方法的解释仅仅是 “建议”。

JDK 17 引入 records 新特性

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

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

相关文章

vs2019托管调试助手 “ContextSwitchDeadlock“错误

错误描述 托管调试助手 "ContextSwitchDeadlock":“CLR 无法从 COM 上下文 0xd183e0 转换为 COM 上下文 0xd18328,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长…

H.264/H.265播放器EasyPlayer.js RTSP播放器关于webcodecs硬解码H265的问题

EasyPlayer.js H5播放器,是一款能够同时支持HTTP、HTTP-FLV、HLS(m3u8)、WS视频直播与视频点播等多种协议,支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式,支持MSE、WASM、WebCodec等多种解码方式&#xff0c…

免费在线图片翻译工具:PicTech

文章目录 简介编辑功能 简介 PicTech是一款免费的在线图片翻译工具。图片翻译,顾名思义就是把图片中的文字翻译成另外一种语言,并以图片的形式输出。这种功能在手机的词典软件中似乎还挺常见的,但作为一种在线工具我还是第一次见。 其使用过…

【Vue】Vue3.0(二十)Vue 3.0 中mitt的使用示例

上篇文章 【Vue】Vue3.0(十九)Vue 3.0 中一种组件间通信方式-自定义事件 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间:2024年11月11日12点23分 文章目录 一、mitt 在…

搭建监控系统Prometheus + Grafana

公司有个技术分享会,但是业务忙,没时间精心准备,所以就匆匆忙忙准备分享一下搭建(捂脸哭)。技术含量确实不多,但是分享的知识确实没问题。 以下是搭建过程: 一、讲解 Prometheus Prometheus 最…

蓝桥杯真题——班级活动

目录 题目链接:1.班级活动 - 蓝桥云课 题目描述 输入格式 输出格式 样例输入 样例输出 样例说明 评测用例规模与约定 解法一:Map集合处理 举个例子 Java写法: C写法: 运行时间 时间复杂度和空间复杂度 时间复杂度…

Win10下使用Anaconda安装GPU版本PyTorch

一、判断是否有Nvidia(英伟达)显卡 右键开始菜单,在弹出选项中选择任务管理器。 点性能选项,然后点GPU。在右上方会显示GPU名称,只有带NVIDIA的英伟达显卡的电脑才能安装GPU版本,否则其他的就只能安装CPU版本。 二、安装CUDA 首…

精品案例PPT | 企业架构及典型设计方案

本文全面介绍企业架构的理论和实践,包括企业架构的概述、元模型、视图、业务架构、应用架构、数据架构、技术架构以及企业架构管控等内容,有助于企业管理者理解和设计企业级的IT架构,确保架构的全局性、整体性、关联性、可控制性、可实现性和…

java--泛型

欢迎来到我的博客~~欢迎大家对我的博客进行指导~点击进入我的博客主页 目录 一、什么是泛型二、包装类2.1基本数据类型和对应的包装类2.2装箱和拆箱2.3 自动装箱和自动拆箱 三、引出泛型四、泛型类的使用4.1 语法4.2示例 五、泛型如何编译的六、泛型的上界6.1语法6.2 示例 七、…

【CentOS】中的Firewalld:全面介绍与实战应用(下)

🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、iptables 时代 2、firewalld 时代 二、服务管…

【新人系列】Python 入门(九):数据结构 - 中

✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们…

如何用【钉钉文档】发公告

功能亮点 ✔️借助钉钉文档强大的编辑能力,可以让编写出的公告更加精美。 ✔️将钉钉文档一键导入公告,可以完整保留已经编辑好的格式,无需再手动调整。 ✔️使用钉钉文档,可以将所有公告内容有序沉淀和保存。 💡 使…

工位管理自动化:Spring Boot企业级工具

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理企业级工位管理系统的相关信息成为必然。开…

相亲小程序(源码+文档+部署+讲解)

最近我在挖掘一些优秀的开源项目时,无意间发现了一个相当给力的系统——相亲小程序管理系统。这个系统不仅功能实用,而且代码结构清晰,易于二次开发。作为一名技术爱好者,我觉得有必要把这个好东西推荐给我的读者们。接下来&#…

Filter and Search 筛选和搜索

Goto Data Grid 数据网格 Filter and Search 筛选和搜索 Filter Drop-down Menus (Excel-style) 筛选器下拉菜单(Excel 样式) 要调用列的筛选器下拉菜单,请单击列标题中的筛选器图标。在 “Values” 选项卡中,用户可以从 Data …

java项目报错:错误提示Could not initialize class com.jacob.com.ComThread

java项目报错:错误提示Could not initialize class com.jacob.com.ComThread 下载地址: 通过网盘分享的文件:jacob-1.19 链接: https://pan.baidu.com/s/1ouudh7A2-Y2kqPh_q-WYiA?pwdqhr3 提取码: qhr3 –来自百度网盘超级会员v7的分享 安…

Linux服务管理-多路径multipath

多路径Multipath 概述 多路径(Multipath)技术,特别是在存储系统中,是一种提高可靠性和性能的重要手段。多路径技术允许服务器通过多条物理路径连接到存储设备。这些路径可以是包含独立电缆、交换机和控制器的物理SAN连接。 多路…

省级绿色金融指数数据(1990-2021年)

绿色信贷是指银行在信贷业务中采纳环境标准,对污染企业的资金进行限制,同时对环保企业给予扶持。这种模式旨在促使贷款企业承担环境责任,实现节能减排,优化产业结构,以及改变经济增长方式。 1990-2021年省级绿色金融指…

【go从零单排】通道select、通道timeout、Non-Blocking Channel Operations非阻塞通道操作

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 select 语句是 Go 的一种控制结构,用于等待多个通道操作。它类似于 s…

Unity资源打包Addressable AA包

从零到一 很多资料都是通过一步步设置讲解的,有时很想先快速实现,再了解细节。 下面就是远程加载Cube.prefab然后实例化简单的代码。 代码中可以不需要远程的网址,不需要资源下载的位置,不需要判断是否已经下载到本地。 那是如…