【发布时间】:2021-01-11 14:52:02
【问题描述】:
我有一个使用 Spring Boot 和 Swagger 的 Java 项目。该项目由一个实现单个端点的简单 API 控制器组成。在端点上调用GET 方法获取所有用户。在同一端点上调用 PUT 方法会更新单个用户:
@RestController
@RequestMapping("/api/v1/users")
public class UserController {
@RequestMapping(value = "", method = RequestMethod.GET)
public List<BaseUser> getUsers(String name) {
return null;
}
@RequestMapping(value = "", method = RequestMethod.PUT)
public BaseUser updateUser(@RequestBody BaseUser user) {
return null;
}
}
/api/v1/users 端点是使用 BaseUser 实现的,它具有像 EmployeeUser 这样的子类型:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = EmployeeUser.class, name = "employee")
})
public abstract class BaseUser {
private final int id;
private final String name;
@JsonCreator
protected BaseUser(
@JsonProperty("id") int id,
@JsonProperty("name") String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}
public class EmployeeUser extends BaseUser {
public EmployeeUser(@JsonProperty("id") int id,
@JsonProperty("name") String name) {
super(id, name);
}
}
使用这种结构,当我浏览 Swagger UI 时,我会看到这些模型类型的重复项(基于 OpenAPI 规范中的定义)。
我预计只会看到一个 BaseUser 和一个 EmployeeUser。重复的原因是什么?
OpenAPI 规范中的定义:
"definitions": {
"BaseUserReq": {
"type": "object",
"discriminator": "type",
"properties": {
"id": {
"type": "integer",
"format": "int32"
},
"name": {
"type": "string"
}
},
"title": "BaseUserReq"
},
"BaseUserRes": {
"type": "object",
"discriminator": "type",
"properties": {
"id": {
"type": "integer",
"format": "int32"
},
"name": {
"type": "string"
}
},
"title": "BaseUserRes"
},
"EmployeeUserReq": {
"title": "EmployeeUser",
"allOf": [{
"$ref": "#/definitions/BaseUserReq"
}, {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int32"
},
"name": {
"type": "string"
}
},
"title": "EmployeeUserReq"
}]
},
"EmployeeUserRes": {
"title": "EmployeeUser",
"allOf": [{
"$ref": "#/definitions/BaseUserRes"
}, {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int32"
},
"name": {
"type": "string"
}
},
"title": "EmployeeUserRes"
}]
}
}
【问题讨论】:
-
BaseUserReq、BaseUserRes、EmployeeUserReq和EmployeeUserRes从何而来?
-
我不知道,它来自 Swagger 工具——我的项目中不存在类型。
-
你使用的是哪个版本的springfox依赖?
-
它们是 3.0.0 版。我的测试 maven 项目在这里可用:filedropper.com/swagger-test
-
请分享一个github repo,它比文件托管更方便
标签: java spring spring-boot swagger springfox