Skip to content

@RequestBody 注解解析补充

AsyncTest Caller 对 @RequestBody 注解类型的解析规则如下:


1️⃣ 简单类型

  • 如果 @RequestBody 标注的类型是简单类型(基本类型、字符串、包装类等),不会生成 Body 内容。

2️⃣ 数组和集合类型

  • 支持 T[]、实现 java.util.Collection 的类型
  • 会被转换为 AsyncTest 的 array 类型
  • 子节点由数组类型或 Collection 泛型决定
  • 如果没有显式指定泛型,则不会添加子节点

示例:

java
@PostMapping("/users")
public Response createUsers(@RequestBody List<UserDTO> users) { ... }

3️⃣ Map 类型

  • 支持 java.util.Map 及其实现类
  • 必须指定泛型
  • 泛型 key 的类型将不会识别,统一视为String类型
  • 转换为 AsyncTest 的 object 类型
  • 子节点是 object,节点名固定为 key,值由泛型决定

示例:

java
@PostMapping("/mapTest")
public Response mapTest(@RequestBody Map<String, UserDTO> userMap) { ... }

4️⃣ POJO 对象

  • 普通 POJO 对象会被递归“炸开”,封装为独立的数据模型
  • 唯一识别方式:package.className<T>,这里的T也是全包路径
  • 泛型不同会被封装为独立 DTO

示例:

java
com.example.ComplexWrapper<com.example.UserDto>
→ Tree 展示为:ComplexWrapper<UserDto>

⚠️ 注意:前端 Tree 组件可能因泛型全引用路径不一致但简称名重复,但内容指向其实不同。


5️⃣ 校验注解

  • 暂不支持字段必填记录
  • 后续支持注解:
    • JavaEE: javax.validation.constraints.NotNullNotEmptyNotBlank
    • JakartaEE: jakarta.validation.constraints.NotNullNotEmptyNotBlank

6️⃣ 接口和抽象类

  • 支持不完整
  • 如果 POJO 泛型字段是抽象类,在编译期无法推断具体字段,只能获取抽象类自身字段

示例:

java
class Zoo {
    private List<Animal> animals;
}

abstract class Animal {
    public String name;
}

class Dog extends Animal {
    public String barkVolume;
}

更推荐的写法,在声明时显式的注册泛型上界

java
class Zoo<T extends Animal> {
    private List<T> animals;
}

abstract class Animal {
    public String name;
}

class Dog extends Animal {
    public String barkVolume;
}

从而在引用时可以明确泛型类型

java
@PostMapping("/mapTest")
public Response mapTest(@RequestBody Zoo<Dog> zoo) { ... }

7️⃣ 特殊规则

  1. 会剔除 java.* 包的属性
  2. DTO 内部字段忽略:
    • @Autowired(未定义 Spring Bean 会有警告,但编译通过)
    • @Value
    • @Resource
  3. 静态字段跳过
  4. 循环嵌套,最大递归层数 20