Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wangpeng1 opened this issue Nov 3, 2023 · 1 comment

Comments

@wangpeng1
Copy link

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

@ZieglerZhu
Copy link

ZieglerZhu commented Jul 2, 2024

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

在这个场景中,从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了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants