当前位置:首页 > 科技  > 软件

基于注解的Controller接口这些高级功能你都知道吗?

来源: 责编: 时间:2024-04-28 08:57:56 300观看
导读环境:SpringBoot2.7.181. 简介基于注解的Controller接口,你可以使用 @RequestMapping 注解将请求映射到控制器方法。它有多种属性,可根据 URL、HTTP 方法、请求参数、头和媒体类型进行匹配。该注解可以在类上使用它来表

环境:SpringBoot2.7.18WmC28资讯网——每日最新资讯28at.com

1. 简介

基于注解的Controller接口,你可以使用 @RequestMapping 注解将请求映射到控制器方法。它有多种属性,可根据 URL、HTTP 方法、请求参数、头和媒体类型进行匹配。该注解可以在类上使用它来表达共享映射,也可以在方法级使用它来缩小特定接口映射的范围。WmC28资讯网——每日最新资讯28at.com

@RequestMapping 还有 HTTP 方法特定的快捷方式变体:WmC28资讯网——每日最新资讯28at.com

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

通过上面的注解,我们能更加具体的去匹配我们的Controller接口方法。这些注解在开发中都是些基本的操作,并且在绝大多数情况下使用这些接口完全够用了。接下来将介绍几个高级用法。WmC28资讯网——每日最新资讯28at.com

2. 实战案例

2.1 HEAD、OPTIONS请求

对于head,options请求Spring并没有提供对应的快捷注解,我们只能通过@RequestMapping注解来指定method属性。WmC28资讯网——每日最新资讯28at.com

@GetMapping (和 @RequestMapping(method=HttpMethod.GET))支持 HTTP HEAD 透明请求映射。控制器方法无需更改。在 javax.servlet.http.HttpServlet 中应用的响应封装器可确保 Content-Length 标头被设置为写入的字节数(而不会实际写入响应)。如下示例:WmC28资讯网——每日最新资讯28at.com

@GetMapping("/h")public Object h() {  System.out.println("header....") ;  return "h method..." ;}

当上面的接口以head方式请求时,也是可以成功进入该方法的只是并不会输出内容到客户端,而仅仅是通过Content-Leng告知有多少个字节内容。WmC28资讯网——每日最新资讯28at.com

图片图片WmC28资讯网——每日最新资讯28at.com

响应header中有Content-LengthWmC28资讯网——每日最新资讯28at.com

图片图片WmC28资讯网——每日最新资讯28at.com

对应HEAD请求我们完全可以通过GET方式来解决。WmC28资讯网——每日最新资讯28at.com

默认情况下,HTTP OPTIONS 的处理方式是将 Allow 响应头设置为具有匹配 URL 模式的所有 @RequestMapping 方法中列出的 HTTP 方法列表。简单说当你通过OPTIONS请求一个URL时,Allow的响应头会设置为你@RequestMapping(method = ...)这里你method设置的列表+OPTIONS,如下示例:WmC28资讯网——每日最新资讯28at.com

@RequestMapping(value = "/o", method = {RequestMethod.DELETE, RequestMethod.HEAD})public Object o() {  System.out.println("o....") ;  return "h method..." ;}

当上面的接口通过OPTIONS请求时,那么响应header Allow将设置为如下:WmC28资讯网——每日最新资讯28at.com

图片图片WmC28资讯网——每日最新资讯28at.com

如果你的@RequestMapping没有指定method属性值,那么Allow 头信息会被设置为 GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS。上面的即可删除method属性再次请求如下:WmC28资讯网——每日最新资讯28at.com

图片图片WmC28资讯网——每日最新资讯28at.com

2.2 自定义请求注解

在某些场景下你可能需要自定义自己的一些注解来配置通用的匹配模式,那么这时候通过自定义请求注解的方式是非常合适的,而不用你对每一个请求都去做重复的事。WmC28资讯网——每日最新资讯28at.com

自定义请求注解WmC28资讯网——每日最新资讯28at.com

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documented@RequestMappingpublic @interface PackMapping { @AliasFor(annotation = RequestMapping.class) String name() default ""; @AliasFor(annotation = RequestMapping.class) String[] value() default {}; @AliasFor(annotation = RequestMapping.class) // 配置只能是GET或POST方法 RequestMethod[] method() default {RequestMethod.GET, RequestMethod.POST} ; @AliasFor(annotation = RequestMapping.class) String[] path() default {}; @AliasFor(annotation = RequestMapping.class) String[] params() default {}; // 设置请求header必须包含X-API-Version并且值必须是v1 @AliasFor(annotation = RequestMapping.class) String[] headers() default {"X-API-Versinotallow=v1"}; @AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; @AliasFor(annotation = RequestMapping.class) String[] produces() default {};}

测试Controller接口WmC28资讯网——每日最新资讯28at.com

@PackMapping("/v")public Object v() {  System.out.println("自定义请求注解....") ;  return "PackMapping method..." ;}

输出结果WmC28资讯网——每日最新资讯28at.com

图片图片WmC28资讯网——每日最新资讯28at.com

请求中必须携带X-API-Version请求header。WmC28资讯网——每日最新资讯28at.com

2.3 动态显示注册接口

你可以通过编程方式注册处理程序方法,这些方法可以用于动态注册或高级情况,例如不同URL下的同一处理程序的不同实例,如下示例:WmC28资讯网——每日最新资讯28at.com

@Configurationpublic class CustomWebConfig {  @Autowired  public void setHandlerMapping(RequestMappingHandlerMapping mapping, UserService handler)      throws NoSuchMethodException {    BuilderConfiguration options = new BuilderConfiguration() ;    options.setPatternParser(new PathPatternParser()) ;    RequestMappingInfo info = RequestMappingInfo.paths("/api/user/{id}").methods(RequestMethod.GET).options(options ).build();    Method method = UserHandler.class.getMethod("getUser", Integer.class) ;    mapping.registerMapping(info, handler, method);  }}

UserServiceWmC28资讯网——每日最新资讯28at.com

@Componentpublic class UserHandler {    @ResponseBody  public User getUser(@PathVairable("id")Integer id) {    User user = new User() ;    user.setId(id) ;    user.setName("张三") ;    return user ;  }}

输出结果WmC28资讯网——每日最新资讯28at.com

图片图片WmC28资讯网——每日最新资讯28at.com

以上是本篇文章的全部内容,如对你有帮助就请作者吃个棒棒糖

本文链接:http://www.28at.com/showinfo-26-86065-0.html基于注解的Controller接口这些高级功能你都知道吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 浅析ServiceMesh和Istio,你学会了吗?

下一篇: C#队列(Queue)的基本使用,一文全掌握

标签:
  • 热门焦点
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • 十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人“珍藏”是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 由于成本持续增加,笔记本产品价格预计将明显上涨

    根据知情人士透露,由于材料、物流等成本持续增加,笔记本产品价格预计将在2021年下半年有明显上涨。进入6月下旬以来,全球半导体芯片缺货情况加剧,显卡、处理器
Top