【发布时间】:2026-02-15 08:30:02
【问题描述】:
给定一个 Spring Boot 项目,该项目使用 springdoc-openapi 库公开一个 OpenAPI (Swagger) 端点,该端点记录了项目的 Spring MVC 控制器端点。
项目中的一个枚举在字段上使用来自Jackson 的@JsonValue 来更改枚举的JSON 表示。该枚举字段使用来自Project Lombok 的@Getter 注释作为getter 公开:
@Getter
public enum Suit {
HEARTS("Hearts"), DIAMONDS("Diamonds"), CLUBS("Clubs"), SPADES("Spades");
@JsonValue
private final String name;
Suit(String name) { this.name = name; }
}
然而,尽管 Jackson 表示基于字段,但 OpenAPI 端点返回的枚举表示使用 enum 的 toString 值代替:
"suit": {
"type": "string",
"enum": [
"HEARTS",
"DIAMONDS",
"CLUBS",
"SPADES"
]
}
预期:
"suit": {
"type": "string",
"enum": [
"Hearts",
"Diamonds",
"Clubs",
"Spades"
]
}
基于springdoc-openapi#1244和swagger-core#3998,很明显@JsonValue注解需要应用于方法,而不是字段。但是,上述尝试的方法和以下方法都不起作用:
@Getter @JsonValue
public enum Suit {
HEARTS("Hearts"), DIAMONDS("Diamonds"), CLUBS("Clubs"), SPADES("Spades");
private final String name;
Suit(String name) { this.name = name; }
}
如何在 Swagger 中使用适当的值公开此枚举,同时仍使用 Lombok 生成 getter?
【问题讨论】:
标签: java jackson swagger lombok springdoc