Подтвердить что ты не робот

Как использовать аннотацию Jackson JsonSubTypes в Kotlin

Я пытаюсь преобразовать некоторый Java-код, который использует аннотацию Jackson @JsonSubTypes для управления полиморфизмом.

Вот рабочий код Java:

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Comment.class, name = "CommentNote"),
    @JsonSubTypes.Type(value = Photo.class, name = "PhotoNote"),
    @JsonSubTypes.Type(value = Document.class, name = "DocumentNote")
})
public abstract class Note implements Identifiable {
    [...]

Вот код Kotlin, который, я думаю, был бы эквивалентен:

JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type")
JsonSubTypes(
    JsonSubTypes.Type(value = javaClass<Comment>(), name = "CommentNote"),
    JsonSubTypes.Type(value = javaClass<Photo>(), name = "PhotoNote"),
    JsonSubTypes.Type(value = javaClass<Document>(), name = "DocumentNote")
)
abstract class Note : Identifiable {
    [...]

Но я получаю следующие ошибки в каждой из трех строк "JsonSubTypes.Type":

Kotlin: An annotation parameter must be a compile-time constant
Kotlin: Annotation class cannot be instantiated

Любая идея?

4b9b3361

Ответ 1

Выводит в компилятор ошибка, спасибо за сообщение об этом. Чтобы обойти эту проблему, вы можете импортировать JsonSubTypes.Type и использовать ее без квалификации:

import org.codehaus.jackson.annotate.JsonSubTypes.Type

JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type")
JsonSubTypes(
    Type(value = javaClass<Comment>(), name = "CommentNote"),
    Type(value = javaClass<Photo>(), name = "PhotoNote"),
    Type(value = javaClass<Document>(), name = "DocumentNote")
)
abstract class Note : Identifiable {
    [...]

Ответ 2

Я считаю, что это было решено, и в настоящее время вы можете написать это так:

import com.fasterxml.jackson.annotation.JsonSubTypes
import com.fasterxml.jackson.annotation.JsonTypeInfo

@JsonTypeInfo(
   use = JsonTypeInfo.Id.NAME,
   include = JsonTypeInfo.As.PROPERTY,
   property = "type")
   @JsonSubTypes(
       JsonSubTypes.Type(value = Comment::class, name = "CommentNote"),
       JsonSubTypes.Type(value = Photo::class, name = "PhotoNote"),
       JsonSubTypes.Type(value = Document::class, name = "DocumentNote"))
interface Note

Обратите внимание на отсутствующие обозначения @ и класса в JsonSubTypes.Type.