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

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

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

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

@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 注解的实现细节就可以发现端倪,注解实现如下:

@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 来避免不传递时报错,具体实现如下:

@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 可以自动绑定数组参数的赋值。后端代码实现:

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

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


3. 传递集合

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

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

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

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

4. 获取 URL 中参数 @RathVariable

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

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

后端实现代码:

@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

后端代码实现:

@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 发送请求:

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


相关文章
|
2月前
|
缓存 安全 Java
《深入理解Spring》过滤器(Filter)——Web请求的第一道防线
Servlet过滤器是Java Web核心组件,可在请求进入容器时进行预处理与响应后处理,适用于日志、认证、安全、跨域等全局性功能,具有比Spring拦截器更早的执行时机和更广的覆盖范围。
|
2月前
|
缓存 监控 Java
《深入理解Spring》拦截器(Interceptor)——请求处理的艺术
Spring拦截器是Web开发中实现横切关注点的核心组件,基于AOP思想,可在请求处理前后执行日志记录、身份验证、权限控制等通用逻辑。相比Servlet过滤器,拦截器更贴近Spring容器,能访问Bean和上下文,适用于Controller级精细控制。通过实现`HandlerInterceptor`接口的`preHandle`、`postHandle`和`afterCompletion`方法,可灵活控制请求流程。结合配置类注册并设置路径匹配与执行顺序,实现高效复用与维护。常用于认证鉴权、性能监控、统一异常处理等场景,提升应用安全性与可维护性。
|
8月前
|
前端开发 Java API
Spring MVC 数据绑定机制详解:@ModelAttribute vs. @RequestParam 和 @PathVariable
本文深入解析了Spring MVC的数据绑定机制,重点对比了`@RequestParam`、`@PathVariable`和`@ModelAttribute`三种注解的使用场景与功能。`@RequestParam`适用于从查询参数或表单数据中提取简单值;`@PathVariable`用于从URL路径中获取资源标识符;而`@ModelAttribute`则能将多个请求参数自动绑定到Java对象,支持复杂数据结构的处理。通过实际案例分析,帮助开发者根据需求选择合适的注解,提升API设计与表单处理效率。
582 9
|
9月前
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
501 0
|
5月前
|
JSON 前端开发 Java
Spring MVC 核心组件与请求处理机制详解
本文解析了 Spring MVC 的核心组件及请求流程,核心组件包括 DispatcherServlet(中央调度)、HandlerMapping(URL 匹配处理器)、HandlerAdapter(执行处理器)、Handler(业务方法)、ViewResolver(视图解析),其中仅 Handler 需开发者实现。 详细描述了请求执行的 7 步流程:请求到达 DispatcherServlet 后,经映射器、适配器找到并执行处理器,再通过视图解析器渲染视图(前后端分离下视图解析可省略)。 介绍了拦截器的使用(实现 HandlerInterceptor 接口 + 配置类)及与过滤器的区别
431 0
|
8月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
796 5
|
8月前
|
JSON 前端开发 Java
彻底搞定 Spring 中的 @PathVariable 和 @ResponseBody
本文深入解析了Spring MVC中`@PathVariable`和`@ResponseBody`的使用方法及适用场景。`@PathVariable`用于从URL路径提取变量,增强REST风格接口的语义性;`@ResponseBody`则将方法返回值直接写入HTTP响应体,适合返回JSON或XML数据。通过多个实际案例,展示了两者在不同场景下的应用,如删除商品、获取商品详情等。文章还总结了最佳实践,帮助开发者更好地理解与运用这两个注解,提升接口设计的清晰度与可维护性。
280 0
|
设计模式 前端开发 Java
Spring MVC——项目创建和建立请求连接
MVC是一种软件架构设计模式,将应用分为模型、视图和控制器三部分。Spring MVC是基于MVC模式的Web框架,通过`@RequestMapping`等注解实现URL路由映射,支持GET和POST请求,并可传递参数。创建Spring MVC项目与Spring Boot类似,使用`@RestController`注解标记控制器类。
179 1
Spring MVC——项目创建和建立请求连接
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
1253 2
|
5月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
923 0