Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Quarkus同步OpenAPI和JSON-B配置 到目前为止_Openapi_Quarkus - Fatal编程技术网

使用Quarkus同步OpenAPI和JSON-B配置 到目前为止

使用Quarkus同步OpenAPI和JSON-B配置 到目前为止,openapi,quarkus,Openapi,Quarkus,我正在尝试使用RESTEasy和JSON-B,按照下面的步骤启动并运行REST服务。 我还添加了对OpenAPI的支持,用于测试以下服务 这两个部分都独立工作,服务会正确返回硬编码的演示数据。Swagger UI显示可用的路由并允许调用它们 然而,它不像我喜欢的那样平滑 在游戏中,我创建了一条路线,返回一个包含即时的对象。在进行调用时,我用属性的ISO 8601格式字符串表示,正如我所期望的那样 但是,属性的关联架构为 Instant: type: object properties:

我正在尝试使用RESTEasy和JSON-B,按照下面的步骤启动并运行REST服务。 我还添加了对OpenAPI的支持,用于测试以下服务

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

然而,它不像我喜欢的那样平滑

在游戏中,我创建了一条路线,返回一个包含
即时
的对象。在进行调用时,我用属性的ISO 8601格式字符串表示,正如我所期望的那样

但是,属性的关联架构为

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
来操作格式。例如:

公共类JsonbInstantTypeAdapter实现JsonbAdapter{
@凌驾
公共OffsetDateTime AdaptoJSON(即时obj){
返回OffsetDateTime.ofInstant(obj,ZoneId.systemDefault());
}
@凌驾
公共即时适配器FromJSON(OffsetDateTime对象){
返回obj.toInstant();
}
}
公共类测试时间戳{
@JsonbTypeAdapter(JsonbInstantTypeAdapter.class)
公共即时getDueTime(){
返回Instant.now();
}
}
这导致
即时
在转换为系统时区后被序列化,调试时更容易读取

我只能部分了解如何调整模式。按如下方式注释该方法:

公共类测试时间戳{
@模式(type=SchemaType.STRING,format=“date-time”)
公共即时getDueTime(){
返回Instant.now();
}
}
结果生成了一个适当的示例值,但生成的模式仍然知道这是一个瞬间,因此生成为

dueTime:
所有:
-$ref:“#/components/schemas/Instant”
-格式:日期时间
类型:字符串
理想情况下,我不想以任何方式分别注释每个方法

问题 有没有一种方法可以将整个项目配置为对给定类型使用特定适配器?
还有一种方法可以确保生成的OpenAPI模式实际上代表的是经过调整的类型而不是原始类型吗?

微文件规范允许您覆盖特定类的模式

将此添加到Quarkus
应用程序中。属性将覆盖日期架构

mp.openapi.schema.java.util.Date = { \
  "name": "EpochMillis" \
  "type": "number", \
  "format": "int64", \
  "description": "Milliseconds since January 1, 1970, 00:00:00 GMT" \
}
这可以解决您在使用
即时
时遇到的问题。

参见

微文件规范,让您覆盖特定类的模式

将此添加到Quarkus
应用程序中。属性将覆盖日期架构

mp.openapi.schema.java.util.Date = { \
  "name": "EpochMillis" \
  "type": "number", \
  "format": "int64", \
  "description": "Milliseconds since January 1, 1970, 00:00:00 GMT" \
}
这可以解决您在使用
即时
时遇到的问题。

请参阅在解决此问题之前,应该先解决
Instant
的短期问题,即使用
@Schema
注释的
实现
属性。当给出
实现时,smallrye open api中的注释扫描器将忽略bean的方法/字段的类型(这将消除示例输出中的
$ref
)。这种方法也适用于OpenAPI中未使用其“自然”类型正确表示的任何其他Java类型

公共类测试时间戳{
@模式(实现=String.class,format=“date-time”)
公共即时getDueTime(){
返回Instant.now();
}
}

在修复之前,应该对
Instant
进行短期变通,即使用
@Schema
注释的
实现
属性。当给出
实现时,smallrye open api中的注释扫描器将忽略bean的方法/字段的类型(这将消除示例输出中的
$ref
)。这种方法也适用于OpenAPI中未使用其“自然”类型正确表示的任何其他Java类型

公共类测试时间戳{
@模式(实现=String.class,format=“date-time”)
公共即时getDueTime(){
返回Instant.now();
}
}

我已打开此问题以跟踪问题并修复修复,感谢您转发此问题。显然,让它开箱即用是最好的情况。同时,您知道独立配置quarkus smallrye openapi的方法吗?我已经打开本期来跟踪问题并修复修复,感谢您转发。显然,让它开箱即用是最好的情况。同时,您知道独立配置quarkus smallrye openapi的方法吗?不幸的是,这只存在于规范的主版本上。它不在Micropofile-open-api-1.1.2(编写时的解析版本)中。不幸的是,这只存在于规范的主版本上。它不在Micropofile-open-api-1.1.2中(撰写本文时已解决的版本)。