Пока что
Я пытаюсь запустить службу REST, следуя официальному руководству , используя RESTEasy и JSON -B. Я также добавил поддержку OpenAPI для тестирования службы, следуя этому руководству .
Обе части работают самостоятельно, служба правильно возвращает жестко закодированные демонстрационные данные. Пользовательский интерфейс Swagger показывает доступные маршруты и позволяет их вызывать.
Однако, это не так гладко, как мне бы хотелось ...
Играя, я создал маршрут, возвращающий объект содержащий Instant
. Во время вызова я представляю строку в формате 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
. форматирования. Например:
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
после преобразования в часовой пояс системы, что может быть проще для чтения во время отладки.
Я мог понять только частично как настроить схему. Аннотирование метода следующим образом:
public class TestTimestamps {
@Schema(type = SchemaType.STRING, format = "date-time")
public Instant getDueTime() {
return Instant.now();
}
}
приводит к созданию правильного примера значения, но сгенерированная схема все еще знает, что это мгновение, поэтому она генерируется как
dueTime:
allOf:
- $ref: '#/components/schemas/Instant'
- format: date-time
type: string
В идеале, я В любом случае не хотелось бы аннотировать каждый метод отдельно.
Вопрос
Есть ли способ настроить для всего проекта на использование определенного адаптера для данного типа? И есть ли способ убедиться, что сгенерированная схема OpenAPI фактически представляет этот адаптированный тип вместо исходного?