Springboot处理请求参数的注解

简介: 在springboot中有几种处理url请求参数的注解,它们分别是:

前言


在springboot中有几种处理url请求参数的注解,它们分别是:


@PathVariable、@RequestHeader、@RequestParam、@MatrixVariable、@RequestBody,今天一起来学习下。


正文


1、@RequestParam


@RequestParam 可以用于将指定的请求参数赋值给方法中的形参。源码如下:


public @interface RequestParam {
  @AliasFor("name")
  String value() default "";
  @AliasFor("value")
  String name() default "";
  boolean required() default true;
  String defaultValue() default ValueConstants.DEFAULT_NONE;
}
复制代码


可以发现它有三个属性:


  • value:请求参数名(必须配置)


  • required:是否必需,默认为 true,即 请求中必须包含该参数,如果没有包含,将会抛出异常(可选配置)


  • defaultValue:默认值,如果设置了该值,required 将自动设为 false,无论你是否配置了required,配置了什么值,都是 false(可选配置)


比如:


@RequestMapping("/testequestparam")
    public String testequestParam(@RequestParam("name") String name){
        return name+",你好啊!";
    }
复制代码


输出结果如下:


7dfb5f9b1ad5431cbd0201400501b642~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

因为required参数默认是true,所以是必须的,如果请求地址后面不带参数则会报错:

2e5db6a82b6e4fa8817ddcf11bc3f17a~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


如果将其值设为false,则请求成功,但是参数值为null:


@RequestMapping("/testequestparam1")
    public String testequestParam1(@RequestParam(value="name",required = false) String name){
        return name+",你好啊!";
    }
复制代码


a8c05d14358d4767be0d3d85d2e99d1e~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

@RequestParam还可以在参数为空的情况下,为我们设置一个参数的默认值:


@RequestMapping("/testequestparam2")
    public String testequestParam2(@RequestParam(defaultValue = "defaultValue") String name){
        return name+",你好啊!";
    }
复制代码


4dcda44d07b94829ad87ec7da35b4bd5~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

2、@PathVariable


@PathVariable是spring3.0的一个新功能,用来接收请求路径中占位符的值,源码如下:


public @interface PathVariable {
  @AliasFor("name")
  String value() default "";
  @AliasFor("value")
  String name() default "";
  boolean required() default true;
}
复制代码


示例:


@GetMapping("/car/{id}/user/{name}/band/{band}")
    //http://localhost:8081/share/car/1/user/李四/band/比亚迪/
    public String testPathVariable(@PathVariable("id") Integer id,
                                   @PathVariable("name") String name,
                                   @PathVariable("band")String band,
                                   @PathVariable Map<String,String> pv){
        return "返回的车是"+name+"的名下id为"+id+"的车,车子的品牌是"+band;
    }
复制代码


返回结果如下:


1980e253fc81436fa5e74a0518466283~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

@PathVariable支持返回所有的路径变量:


@GetMapping("/map/car/{id}/user/{name}/band/{band}")
    public Map<String,Object> testPathVariableMap(@PathVariable("id") Integer id,
                                                  @PathVariable("name") String name,
                                                  @PathVariable("band")String band,
                                                  @PathVariable Map<String,String> pv){
        Map<String,Object> map = new HashMap<>();
        map.put("id",id);
        map.put("name",name);
        map.put("band",band);
        map.put("pv",pv);
        return map;
    }
复制代码


f12e25ed05cc4991b16767e3ca64f94e~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

除此之外@PathVariable还有和@RequestParam相同的属性required,用法一样,这里不再说明。

3、@RequestHeader

我们知道一个请求中会包含一些请求头等信息,如下:

5b88015f5a06449eb8af46f6d2ab81cd~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


@RequestHeader是获取请求头中的数据,通过指定参数 value 的值来获取请求头中指定的参数值。源码如下:


public @interface RequestHeader {
  @AliasFor("name")
  String value() default "";
  @AliasFor("value")
  String name() default "";
  boolean required() default true;
  String defaultValue() default ValueConstants.DEFAULT_NONE;
}
复制代码


通过源码可以发现其他参数用法和 @RequestParam完全一样。示例:


@GetMapping("/map1/car/{id}/user/{name}/band/{band}")
    public Map<String,Object> testPathVariableMap1(@PathVariable("id") Integer id,
                                                   @PathVariable("name") String name,
                                                   @PathVariable("band")String band,
                                                   @PathVariable Map<String,String> pv,
                                                   @RequestHeader("User-Agent") String useragent,
                                                   @RequestHeader Map<String,String> header) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        map.put("name", name);
        map.put("band", band);
        map.put("pv", pv);
        map.put("useragent",useragent);
        map.put("header",header);
        return map;
    }
复制代码


ce7b6d8ec67f4b2496bd36132ddce1ef~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

4、@MatrixVariable


@MatrixVariabl注解拓展了URL请求地址的功能。使用@Matrixvariable注解时多个变量可以使用;(分号)分隔,该注解允许开发者进行多条件组合査询。其源码如下:


public @interface MatrixVariable {
  @AliasFor("name")
  String value() default "";
  @AliasFor("value")
  String name() default "";
  String pathVar() default ValueConstants.DEFAULT_NONE;
  boolean required() default true;
  String defaultValue() default ValueConstants.DEFAULT_NONE;
}
复制代码


可以发现其属性和RequestParam基本完全一样,但是多了一个pathVar属性,它表示矩阵变量所在的URI路径变量的名称,如有必要消除歧义(例如,在多个路径段中存在同名的矩阵变量)。示例:


@GetMapping("/phone/{path}")
    public Map carsSell(@MatrixVariable("low") Integer low,
                        @MatrixVariable("band") List<String> brand,
                        @PathVariable("path") String path){
        Map<String,Object> map = new HashMap<>();
        map.put("low",low);
        map.put("brand",brand);
        map.put("path",path);
        return map;
复制代码


它和前面的注解直接使用是不行的,需要进行处理,因为SpringBoot默认是禁用了矩阵变量的功能,需要进行处理手动开启,对于路径的处理是通过UrlPathHelper进行解析,removesemicolonconten(移除分号内容)支持矩阵变量:这里写一个配置类:


@Configuration(proxyBeanMethods = false)
public class WebConfig implements WebMvcConfigurer {
    @Bean
    public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
        HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
        hiddenHttpMethodFilter.setMethodParam("_m");
        return hiddenHttpMethodFilter;
    }
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer){
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        //false表示不移除;后面的内容,矩阵变量功能就能生效
        urlPathHelper.setRemoveSemicolonContent(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}
复制代码


9284a6e60e914699ba8fc385a7016c4f~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

5、@RequestBody


@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);而最常用的使用请求体传参的无疑是POST请求了,所以使用@RequestBody接收数据时,一般都用POST方式进行提交。源码如下:


public @interface RequestBody {
  boolean required() default true;
}
复制代码


该注解只有一个required属性,默认是true。使用如下:


@PostMapping("/share/save")
    public Map postMethod(@RequestBody String content){
        Map<String,Object> map = new HashMap<>();
        map.put("content",content);
        return map;
    }
复制代码


5b88015f5a06449eb8af46f6d2ab81cd~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

总结


以上就是springboot中几个对于请求参数处理的注解,通过这些注解我们能够获取url中的参数然后进行对应的业务开发处理。


如有任何问题或者不对的地方欢迎一起交流讨论学习!


目录
相关文章
|
3月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
600 128
|
3月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
459 0
|
3月前
|
Java 测试技术 API
将 Spring 的 @Embedded 和 @Embeddable 注解与 JPA 结合使用的指南
Spring的@Embedded和@Embeddable注解简化了JPA中复杂对象的管理,允许将对象直接嵌入实体,减少冗余表与连接操作,提升数据库设计效率。本文详解其用法、优势及适用场景。
309 126
|
4月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
427 2
|
3月前
|
Java 测试技术 数据库
使用Spring的@Retryable注解进行自动重试
在现代软件开发中,容错性和弹性至关重要。Spring框架提供的`@Retryable`注解为处理瞬时故障提供了一种声明式、可配置的重试机制,使开发者能够以简洁的方式增强应用的自我恢复能力。本文深入解析了`@Retryable`的使用方法及其参数配置,并结合`@Recover`实现失败回退策略,帮助构建更健壮、可靠的应用程序。
438 1
使用Spring的@Retryable注解进行自动重试
|
3月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
317 12
|
3月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
201 0
探索Spring Boot的@Conditional注解的上下文配置
|
3月前
|
智能设计 Java 测试技术
Spring中最大化@Lazy注解,实现资源高效利用
本文深入探讨了 Spring 框架中的 `@Lazy` 注解,介绍了其在资源管理和性能优化中的作用。通过延迟初始化 Bean,`@Lazy` 可显著提升应用启动速度,合理利用系统资源,并增强对 Bean 生命周期的控制。文章还分析了 `@Lazy` 的工作机制、使用场景、最佳实践以及常见陷阱与解决方案,帮助开发者更高效地构建可扩展、高性能的 Spring 应用程序。
153 0
Spring中最大化@Lazy注解,实现资源高效利用