dhr*_*hrm 5 java spring swagger spring-boot springfox
我有一个使用 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;
}
}
Run Code Online (Sandbox Code Playgroud)
端点/api/v1/users
是使用BaseUser
具有如下子类型的a 实现的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;
}
}
Run Code Online (Sandbox Code Playgroud)
public class EmployeeUser extends BaseUser {
public EmployeeUser(@JsonProperty("id") int id,
@JsonProperty("name") String name) {
super(id, name);
}
}
Run Code Online (Sandbox Code Playgroud)
通过这种结构,当我浏览 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"
}]
}
}
Run Code Online (Sandbox Code Playgroud)
我在 3.0.0 版本中遇到了类似的问题和其他问题,所以我仍然在我的项目中使用 2.9.2。您可以尝试以下方法作为替代方案。
将测试项目中的依赖项更改为(删除springfox-bean-validators
, )时:springfox-boot-starter
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
...并将SwaggerConfig
(在更改依赖项后删除丢失的导入)更改为:
@Configuration
@EnableSwagger2
public class SwaggerConfig { }
Run Code Online (Sandbox Code Playgroud)
... Swagger UI 端点http://localhost:8080/swagger-ui.html
将返回您期望的类:
另外,您可以删除spring-core
依赖项,因为它已经打包在spring-boot-starter-web
,maven-compiler-plugin
依赖项中,因为它是一个插件,并删除重复的 Maven 编译器源和目标定义,这些定义被定义为属性,并再次定义为 Maven 编译器插件的配置。
归档时间: |
|
查看次数: |
8532 次 |
最近记录: |