【Spring】“请求“ 之后端传参重命名,传递数组、集合,@PathVariable,@RequestPart

1. 后端传参重命名(后端参数映射)

某些特殊情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传了一个 time 给后端,而后端是使用 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值

java 复制代码
@RequestMapping("/m4")  
public Object method4(@RequestParam("time") String createtime) {  
    return "收到参数:createtime="+ createtime;  
}
  • 使用浏览器发送请求并传参:
    http://127.0.0.1:8080/param/m4?time=2024-10-4
    可以看到,Spring 可以正确的把浏览器传递的参数 time 绑定到后端参数 createtime 上。此时,如果浏览器使用 createtime 进行参数传递呢?
    错误日志信息为:
  • 控制台打印日志显示:请求参数"time"不存在

可以得出结论:

  • 使用 @RequestParam 进行参数重命名时,请求参数只能和 @RequestParam 声明的名称一致,才能进行参数绑定和赋值
  • 使用 @RequestParam 进行参数重命名时,参数就变成了必传参数(不传参数的话就会报 400 错误)

非必传参数设置

如果我们的实际业务前端的参数是一个非必传的参数,针对上述问题,如何解决呢?

先来了解一下参数必传的原因,我们查看 @RequestParam 注解的实现细节就可以发现端倪,注解实现如下:

java 复制代码
@Target({ElementType.PARAMETER})  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
public @interface RequestParam {  
    @AliasFor("name")  
    String value() default "";  
  
    @AliasFor("value")  
    String name() default "";  
  
    boolean required() default true;  
  
    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";  
}

可以看到,required 的默认值为 true,表示含义就是:该注解修饰的参数默认为必传 。既然如此,我们可以通过设置 @RequestParam 中的 require=false 来避免不传递时报错,具体实现如下:

java 复制代码
@RequestMapping("/m5")  
public Object method5(@RequestParam(value = "time", required = false) String createtime) {  
    return "接收到参数 createtime: " + createtime;  
}
  • 可以看到,添加 required=false 之后,time 前面也加了 key,变成了 value="time"
  • 注解属性时,没有指明 key 的话,默认为 value 属性
  • 如果需要对多个属性进行赋值时,需要写上 key

2. 传递数组

Spring MVC 可以自动绑定数组参数的赋值。后端代码实现:

java 复制代码
@RequestMapping("/m6")  
public String method6(String[] arrayParam) {  
    return Arrays.toString(arrayParam);  
}

数组参数:请求参数名与形参数组名称相同且请求参数为多个,后端定义数组类型形参即可接收参数


3. 传递集合

集合参数:和数组类似,同一个请求参数名有为多个,且需要使用 @RequestParam 绑定参数关系

  • 默认情况下,请求中参数名相同的多个值,是封装到数组。如果要封装到集合,就要使用 @RequestParam 绑定参数关系

请求方式和数组类似,后端代码为:

java 复制代码
@RequestMapping("/m7")  
public String method7(@RequestParam List<String> listParam) {  
    return "size: " + listParam.size() + ", listParam:" + listParam;  
}

4. 获取 URL 中参数 @RathVariable

path variable:路径变量。和字面意思表达的一样,这个注解主要作用是在请求 URL 路径上进行数据绑定

  • 默认传参数写在 URL 上,Spring MVC 就可以获取到

后端实现代码:

java 复制代码
@RequestMapping("/m10/{id}/{name}")  
public Object method10(@PathVariable Integer id, @PathVariable("name") String userName){  
    return "解析参数id: "+id+", name: "+userName;  
}
  • 可以看到,后端正确获取到了 URL 中的参数,参数对应关系如下:
  • 如果方法参数名称和需要绑定的 URL 中的变量名称一致时,可以简写,不用给 @PathVariable 的属性赋值,如上述例子中的 id 变量
  • 如果方法参数名称和需要绑定的 URL 中的变量名称不一致时,需要 @PathVariable 的属性 value 赋值,如上述例子中的 userName

5. 上传文件 @RequestPart

后端代码实现:

java 复制代码
@RequestMapping("/m11")  
public Object method11(@PathVariable("file")MultipartFile file) throws IOException {  
    //获取文件名称  
    String fileName = file.getOriginalFilename();  
    //文件上传到指定路径  
    file.transferTo(new File("D:/" + file.getOriginalFilename()));  
    return "接收到文件名称为: "+fileName;  
}

使用 Postman 发送请求:

观察目标路径,文件是否上传成功

相关推荐
Neoest4 分钟前
【EasyExcel 填坑日记】“Syntax error on token )“: 一次编译错误在逃 Runtime 的灵异事件
java·eclipse·编辑器
自在极意功。6 分钟前
Web开发中的分层解耦
java·microsoft·web开发·解耦
是一个Bug8 分钟前
ConcurrentHashMap的安全机制详解
java·jvm·安全
断剑zou天涯11 分钟前
【算法笔记】bfprt算法
java·笔记·算法
番石榴AI14 分钟前
java版的ocr推荐引擎——JiaJiaOCR 2.0重磅升级!纯Java CPU推理,新增手写OCR与表格识别
java·python·ocr
码事漫谈1 小时前
VSCode CMake Tools 功能解析、流程与最佳实践介绍
后端
鸽鸽程序猿1 小时前
【项目】【抽奖系统】抽奖
java·spring
火云牌神1 小时前
本地大模型编程实战(38)实现一个通用的大模型客户端
人工智能·后端
码事漫谈1 小时前
从C++/MFC到CEF与TypeScript的桌面架构演进
后端
GoogleDocs2 小时前
基于[api-football]数据学习示例
java·学习