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