Skip to content

方法参数解析支持

AsyncTest Caller 对方法参数的解析遵循 “排除特定类型 → 显式注解优先 → 隐式兜底” 的原则,形成如下责任链:

解析责任链:

  1. 显式注解(如 @RequestBody@RequestParam 等)
  2. HttpEntity 相关类型
  3. 文件类型
  4. 隐式简单类型
  5. 隐式复杂对象(单层 POJO)

1️⃣ 忽略的参数类型

以下参数将被直接忽略,不参与接口解析:

Servlet API (旧 & 新)

  • javax.servlet.ServletRequest
  • javax.servlet.http.HttpServletRequest
  • javax.servlet.http.HttpServletResponse
  • javax.servlet.http.HttpSession
  • jakarta.servlet.ServletRequest
  • jakarta.servlet.http.HttpServletRequest
  • jakarta.servlet.http.HttpServletResponse
  • jakarta.servlet.http.HttpSession

Spring Context / UI

  • org.springframework.ui.Model
  • org.springframework.validation.BindingResult
  • org.springframework.validation.Errors
  • org.springframework.web.bind.support.SessionStatus
  • org.springframework.web.context.request.WebRequest
  • org.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
  • 文件类型:MultipartFilejavax.servlet.http.Partjakarta.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 文件类型

  • 支持类型:MultipartFilejavax.servlet.http.Partjakarta.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 中接口数据结构与实际运行一致