给定一个Spring项目,该项目使用斯普林多-奥帕库公开一个OpenAPI (Swagger)端点,记录该项目的Spring控制器端点。
该项目中的一个枚举在字段中使用来自@JsonValue
的杰克逊来更改枚举的JSON表示形式。使用来自@Getter
的Lombok项目注释将此枚举字段公开为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#1244和装腔作势#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; }
}
如何在使用Lombok生成getter的同时,使用Swagger中的适当值来暴露这个枚举?
发布于 2022-01-18 06:26:13
解决方案是告诉Lombok在生成的getter方法上使用注释,在字段上使用@Getter(onMethod_ = @JsonValue)
。
public enum Suit {
HEARTS("Hearts"), DIAMONDS("Diamonds"), CLUBS("Clubs"), SPADES("Spades");
@Getter(onMethod_ = @JsonValue)
private final String name;
Suit(String name) { this.name = name; }
}
onMethod
属性记录在@Getter和@Setter和onX文档中:
要在生成的方法上添加注释,可以使用
onMethod=@__({@AnnotationsHere})
。…有关更多细节,请参见关于onX特性的文档。语法有点奇怪,取决于您正在使用的javac。 在javac7上,要使用3种onX
特性中的任何一种,必须包装要应用于@__(@AnnotationGoesHere)
中的构造函数/方法/参数的注释。若要应用多个注释,请使用@__({@Annotation1, @Annotation2})
。注释本身显然也有参数。 在javac8和up上,在onMethod
、onParam
或onConstructor
之后添加下划线。
https://stackoverflow.com/questions/70751146
复制相似问题