当前位置: 首页 > 知识库问答 >
问题:

如何使用springdoc openapi和Lombok getter将@JsonValue用于招摇过市的枚举值

柯波
2023-03-14

给定一个Spring Boot项目,该项目使用springdoc-openapi库公开一个OpenAPI(Swagger)endpoint,该endpoint记录了项目的Spring MVC控制器endpoint。

项目中的一个枚举使用Jackson在字段上提供的JsonValue来更改枚举的JSON表示形式。使用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表示基于字段,但OpenAPIendpoint返回的枚举表示使用枚举的值:

"suit": {
  "type": "string",
  "enum": [
    "HEARTS",
    "DIAMONDS",
    "CLUBS",
    "SPADES"
  ]
}

预期:

"suit": {
  "type": "string",
  "enum": [
    "Hearts",
    "Diamonds",
    "Clubs",
    "Spades"
  ]
}

基于springdoc openapi#1244和swagger core#3998,显然需要将注释应用于方法,而不是字段。然而,上述尝试的方法和以下方法均无效:

@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?

共有1个答案

公良修竹
2023-03-14

解决方案是告诉Lombok在生成的getter方法上使用注释,在字段上使用getter(onMethod\u=@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=@\uu({@AnnotationsHere})。[…]有关更多详细信息,请参阅有关onX功能的文档。

语法有点奇怪,这取决于您使用的javac
在javac7上,要使用3个onX功能中的任何一个,您必须将要应用于构造函数/方法/参数的注释包装在@(@annotationgoesher)中。若要应用多个批注,请使用({@Annotation1,@Annotation2})。注释本身显然也可以有参数
在javac8及以上版本中,可以在方法、参数或构造函数后添加下划线。

 类似资料:
  • 我正在使用swagger doc为我的应用程序生成API。doc是用yml编写的,在某些地方它将定义一些枚举道具(我们使用mysql)。这看起来像: 我希望得到这样的东西: 正如您所看到的,类型字段将是一个在配置文件中定义的字符串,但我收到的是这个字符串: Swagger将第一个值设置为数据类型,这是绝对错误的。所以问题是如何为“type”字段获取值“string”。

  • 我试图在我的微服务项目中生成一个单独的招摇过市,在Api网关中将所有服务招摇过市聚合成一个单独的招摇过市。为了实现这一点,我将遵循下一个教程https://objectpartners.com/2017/09/28/aggregate-services-into-a-single-swagger 这里的问题是,当我尝试设置绝对URL时,我收到的输出是未能加载API定义。未定义的http://loc

  • 我正在编写一个OpenAPI(Swagger)定义,其中一个查询参数可以取无,或N个值,如下所示: 如何在OpenAPI YAML中编写此内容? 我尝试了以下方法,但没有产生预期的结果:

  • 我希望能够使用此枚举定义: ...然而,在参数定义内部,我不断得到错误: 错误: Swager错误:不是有效的参数定义

  • 我的pom.xml 招摇过市配置 服务器日志 它说映射: 但这些都不起作用(404): 如果我使用sping-fox较低版本,那么我将在我的日志中得到它已映射{[/v2/api-docs}],方法=[GET]。但是,我看不到在那里生成的任何json。

  • 我正在努力理解如何为API网关使用Swagger扩展: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-swagger-extensions.html 我正在通过AWS CLI使用导入/导出RestAPI,但在命令行中找不到如何使用它们的任何示例。你能帮忙吗? 谢谢