elunez / eladmin

eladmin jpa 版本:项目基于 Spring Boot 2.6.4、 Jpa、 Spring Security、Redis、Vue的前后端分离的后台管理系统,项目采用分模块开发方式, 权限控制采用 RBAC,支持数据字典与数据权限管理,支持一键生成前后端代码,支持动态路由
https://eladmin.vip/demo
Apache License 2.0
21.25k stars 7.35k forks source link

执行@RequestMapping("/api/dict") 传参后怎么映射到queryDict(DictQueryCriteria resources, Pageable pageable) #828

Open wangpeng1 opened 11 months ago

wangpeng1 commented 11 months ago

查询字典时候传的参数是http://localhost:8013/api/dict?page=0&size=10&sort=id%2Cdesc 请问他是经过什么过程 queryDict(DictQueryCriteria resources, Pageable pageable)映射到这两个变量上的

ZieglerZhu commented 3 months ago

这个问题我也挺好奇,就问了下通义,答复如下

在这个场景中,从URL http://localhost:8013/api/dict?page=0&size=10&sort=id%2Cdesc 中传递的查询参数能够被Spring框架自动映射到方法参数DictQueryCriteria resources 和 Pageable pageable 上,这个过程主要依赖于Spring MVC的请求参数绑定机制。具体映射过程大致如下: URL解码与参数解析:首先,Web服务器(如Tomcat)接收到请求后,会对URL进行解码,将 %2C 转换为 , 等,得到实际的查询参数 page=0&size=10&sort=id,desc。 Spring MVC参数绑定: 对于 Pageable pageable: Spring MVC通过检查方法签名中的Pageable类型参数,会自动处理page、size和sort这些常见的分页和排序请求参数。它会将page=0映射到分页的页码,size=10映射到每页大小,而sort=id,desc解析为按照id字段降序排序的规则,然后创建一个PageRequest实例填充这些值,作为Pageable接口的实现。 对于 DictQueryCriteria resources: 这个自定义对象的绑定稍微复杂一些。Spring会尝试使用DictQueryCriteria类中定义的setter方法或构造函数(如果有并且标记了@NoArgsConstructor@AllArgsConstructor等Lombok注解),与请求中的参数名称匹配。如果请求中有与DictQueryCriteria属性名相同的参数(例如,如果DictQueryCriteria有name属性,而请求中有name=value这样的参数),Spring会自动将这些值设置到DictQueryCriteria对象的相应属性中。如果参数名称不直接匹配,可能需要额外的配置(如@RequestParam注解来指定参数名)或自定义参数解析器来完成映射。 方法调用:完成参数绑定后,Spring会调用queryDict方法,此时resources和pageable变量已经根据请求参数初始化完毕,可以用于后续的业务逻辑处理。 总之,Spring MVC通过其内置的参数解析机制,依据方法签名和请求参数,自动完成了从HTTP请求参数到Java方法参数的映射。

我的理解:

  1. 前面的URL解析通义回答的蛮详细了,解析出来的page, size, sort 会在org.springframework.data.domain.PageRequest#PageRequest这个构造函数中赋值;
  2. 第一个参数DictQueryCriteria resources为什么没有赋值,大概率是是没有在搜索框内输入条件,如果有输入的话(比如输入1)会变成?page=0&size=10&sort=id%2Cdesc&blurry=1,这样就会像通义的回答里说的,用setter或者构造函数赋值给DictQueryCriteria类里的字段blurry了