Я новичок в Quarkus и Kotlin, и, по правде говоря, я еще не совсем уверен, что происходит за кулисами и какая библиотека JSON на самом деле отвечает за рендеринг ответа JSON от ресурса, когда я устанавливаю @Produces(MediaType.APPLICATION_JSON)
для своей функции. Но я возвращаю экземпляр класса данных, который я создал из этого метода, и все поля этого класса данных отображаются в ответе. Однако у меня есть несколько классов ответа, и я хотел бы включить имя класса в ответ JSON. Теперь у меня есть поле String, которое просто жестко закодировано для имени класса, но это некрасиво, поскольку мне приходится повторять имя класса:
data class StuffInitiatedResponse (
val id: String,
val projectId: String
) {
val operation = "StuffInitiatedResponse"
}
data class StuffCompletedResponse (
val id: String,
val projectId: String,
) {
val operation = "StuffCompletedResponse"
}
А в моем классе обслуживания:
@Path("/myservice")
class MyService {
@POST
@Path("{project}/{path:.*}")
@Produces(MediaType.APPLICATION_JSON)
fun initiateStuff(@PathParam project: String,
@PathParam path: String,
@QueryParam("completedId") completedId: String?) : StuffInitiatedResponse {
if (completedId == null) {
println("I've initiated stuff")
return StuffInitiatedResponse(UUID.randomUUID().toString(), project)
} else {
println("I've completed stuff")
return StuffCompletedResponse(completedId, project)
}
}
}
Это дает то, что я ожидал, но, как я уже сказал, меня раздражает то, что мне приходится повторять имя класса в поле ответа классов данных. Есть ли способ встроить имя класса в JSON?
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include = As.PROPERTY, property = "operation")
, но это не сработало. 06.01.2021quarkus-resteasy-jsonb
наquarkus-resteasy-jackson
, и это заставило работать аннотацию JsonTypeInfo. Понятия не имею, какая разница между jsonb и jackson здесь, но я буду придерживаться jackson, поскольку считаю, что он более зрелый и, следовательно, более документированный. 06.01.2021