首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Quarkus同步OpenAPI和JSON配置

使用Quarkus同步OpenAPI和JSON配置
EN

Stack Overflow用户
提问于 2020-04-23 18:25:29
回答 2查看 709关注 0票数 1

到目前为止

我正在尝试使用官方指南和JSON启动和运行一个REST服务。我还添加了对OpenAPI的支持,用于测试本指南之后的服务。

这两个部分各自工作,服务正确地返回硬编码的演示数据。Swagger显示可用的路由并允许调用它们。

但是,它并不像我喜欢的那样光滑.

在这里,我创建了一个返回包含Instant的对象的路由。进行调用时,我被表示为属性的ISO 8601格式化字符串,正如我所期望的那样。

但是,属性的关联架构是

代码语言:javascript
复制
Instant:
  type: object
  properties:
    nanos:
      format: int32
      type: integer
    seconds:
      format: int64
      type: integer
    epochSecond:
      format: int64
      type: integer
    nano:
      format: int32
      type: integer

这与实际返回的内容不一致。我有点明白它是从哪里来的。显然,quarkus-smallrye-openapi在检查Instant时使用的设置与quarkus-resteasy-jsonb使用的设置不同。

对于后者,我已经发现可以使用自定义JsonbAdapter来操作格式设置。例如:

代码语言:javascript
复制
public class JsonbInstantTypeAdapter implements JsonbAdapter<Instant, OffsetDateTime> {
    @Override
    public OffsetDateTime adaptToJson(Instant obj) {
        return OffsetDateTime.ofInstant(obj, ZoneId.systemDefault());
    }

    @Override
    public Instant adaptFromJson(OffsetDateTime obj) {
        return obj.toInstant();
    }
}

public class TestTimestamps {
    @JsonbTypeAdapter(JsonbInstantTypeAdapter.class)
    public Instant getDueTime() {
        return Instant.now();
    }
}

这将导致Instant在转换成系统的时区后被序列化,这可以在调试时更容易读取。

我只能部分地想出如何调整模式。对该方法进行如下注释:

代码语言:javascript
复制
public class TestTimestamps {
    @Schema(type = SchemaType.STRING, format = "date-time")
    public Instant getDueTime() {
        return Instant.now();
    }
}

结果生成一个适当的示例值,但生成的模式仍然知道它是瞬间生成的,因此它生成为

代码语言:javascript
复制
dueTime:
    allOf:
        - $ref: '#/components/schemas/Instant'
        - format: date-time
          type: string

理想情况下,我不想单独地注释每个方法。

问题是

是否有一种方法可以将项目范围内的特定适配器配置为特定类型?是否有一种方法可以确保生成的OpenAPI模式实际上表示的是适应的类型而不是原始的类型?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61394407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档