方法参数解析支持
AsyncTest Caller 对方法参数的解析遵循 “排除特定类型 → 显式注解优先 → 隐式兜底” 的原则,形成如下责任链:
解析责任链:
- 显式注解(如
@RequestBody、@RequestParam等) - HttpEntity 相关类型
- 文件类型
- 隐式简单类型
- 隐式复杂对象(单层 POJO)
1️⃣ 忽略的参数类型
以下参数将被直接忽略,不参与接口解析:
Servlet API (旧 & 新)
javax.servlet.ServletRequestjavax.servlet.http.HttpServletRequestjavax.servlet.http.HttpServletResponsejavax.servlet.http.HttpSessionjakarta.servlet.ServletRequestjakarta.servlet.http.HttpServletRequestjakarta.servlet.http.HttpServletResponsejakarta.servlet.http.HttpSession
Spring Context / UI
org.springframework.ui.Modelorg.springframework.validation.BindingResultorg.springframework.validation.Errorsorg.springframework.web.bind.support.SessionStatusorg.springframework.web.context.request.WebRequestorg.springframework.web.context.request.NativeWebRequest
2️⃣ 变量注解支持
插件支持的显式注解如下:
@RequestBody→ Body@RequestParam→ Params / Form-Data@ModelAttribute→ 隐式 POJO / Params@RequestPart→ 文件 / Form-Data@PathVariable→ 路径变量,不解析@CookieValue→ Header@RequestHeader→ Header
忽略的注解: @RequestAttribute、@SessionAttribute、@Value
3️⃣ 各注解解析规则
3.1 @RequestBody
- 参数归纳到 Body
- 递归解析成独立 DTO(AsyncTest DataStructure)
- 遇到简单类型停止递归
- 文件类型字段会被剔除
- 参数本身为文件类型 → 忽略
示例:
java
@PostMapping("/user")
public Response createUser(@RequestBody UserDTO user) { ... }3.2 @RequestHeader / @CookieValue
- 忽略
org.springframework.http.HttpHeaders - 默认使用注解
name/value,取不到用变量名 - 简单类型统一标记为 String
- POJO 类型在无自定义转换器情况下忽略
@CookieValue解析规则同上
示例:
java
@GetMapping("/info")
public Response getInfo(@RequestHeader("Authorization") String token,
@CookieValue("SESSIONID") String sessionId) { ... }3.3 @RequestParam
- 普通类型 → Params
- 文件类型:
MultipartFile、javax.servlet.http.Part、jakarta.servlet.http.Part→ Body,Content-Type 为multipart/form-data - POJO 类型不支持 → 尝试映射到基础类型,失败则作为 String
示例:
java
@PostMapping("/upload")
public Response uploadFile(@RequestParam("file") MultipartFile file,
@RequestParam("name") String name) { ... }3.4 @ModelAttribute
- 未标注任何 Spring Web 参数注解的变量也会隐式使用
- 支持简单类型和单层 POJO
- 不支持文件类型
示例:
java
@PostMapping("/submit")
public Response submitForm(@ModelAttribute UserForm form) { ... }3.5 HttpEntity 支持
- 支持
HttpEntity<T>与RequestEntity<T> - 类型变量归纳到 Body
- POJO 中含文件类型字段 → 忽略
- 必须显式声明泛型
- HttpEntity 的 headers 内容忽略
示例:
java
@PostMapping("/api")
public Response apiCall(HttpEntity<ApiDTO> request) { ... }3.6 文件类型
- 支持类型:
MultipartFile、javax.servlet.http.Part、jakarta.servlet.http.Part及数组/集合形式 - Content-Type 强制
multipart/form-data
示例:
java
@PostMapping("/uploadMultiple")
public Response uploadMultipleFiles(@RequestParam List<MultipartFile> files) { ... }3.7 简单类型
- 基本类型、数组、原生集合、泛型集合、枚举、文本、包装类、日期时间、UUID、URI
- 一般归入 Params
- 若存在文件类型参数 → 强制放入 Form-Data
示例:
java
@GetMapping("/search")
public Response search(@RequestParam String keyword, @RequestParam int page) { ... }3.8 POJO
- 不支持接口和抽象类
- 仅支持单层结构
- 不支持嵌套文件类型 POJO
- 文件类型字段 → 参照【文件类型支持】
示例:
java
@PostMapping("/profile")
public Response updateProfile(@ModelAttribute ProfileDTO profile) { ... }✅ 总结
- 参数解析遵循责任链:显式注解 > HttpEntity > 文件 > 简单类型 > POJO
- 注解类型和参数类型共同决定归属(Body / Params / Header / Path / Form-Data)
- 插件模拟 Spring MVC 行为,保证 AsyncTest 中接口数据结构与实际运行一致