@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.NotNull、NotEmpty、NotBlank - JakartaEE:
jakarta.validation.constraints.NotNull、NotEmpty、NotBlank
- JavaEE:
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️⃣ 特殊规则
- 会剔除
java.*包的属性 - DTO 内部字段忽略:
@Autowired(未定义 Spring Bean 会有警告,但编译通过)@Value@Resource
- 静态字段跳过
- 循环嵌套,最大递归层数 20