Я пытаюсь создать пользовательскую аннотацию для токенизации заданного свойства всегда, когда оно помечено, поэтому у меня следующая структура:
@JsonComponent
public class TokenSerializer {
@JsonSerialize(using = IdToTokenSerializer.class) // This does not work
@JsonDeserialize(using = TokenToIdDeserializer.class) // This does not work
@Retention(RetentionPolicy.RUNTIME)
public static @interface TokenizedId {
Class<?> value();
}
public static class IdToTokenSerializer extends JsonSerializer<Long> implements ContextualSerializer {
...
}
public static class TokenToIdDeserializer extends JsonDeserializer<Long> implements ContextualDeserializer {
...
}
}
Почему я так использую? Потому что @TokenizedId
предоставит класс, который условно будет рассмотрен на сериализаторе / десериализаторе, чтобы что-то сделать.Это значение настраивается с помощью ContextualDeserializer
, извлекающего класс из @TokenizedId
.
Проблема заключается в том, что и сериализатор, и десериализатор не работают, когда я аннотирую так:
@TokenizedId(MyClass.class)
private Long id;
Но они работают, когда я использую вот так (удаляя @JsonSerialize
и @JsonDeserialize
из @TokenizedId
):
@JsonSerialize(using = IdToTokenSerializer.class)
@JsonDeserialize(using = TokenToIdDeserializer.class)
@TokenizedId(MyClass.class)
private Long id;
Лично мне не понравился этот подход, так как разработчикам всегда нужно помнитьиспользуйте эти три аннотации, когда они хотят токенизировать некоторый идентификатор, а также мне хотелось бы, чтобы @TokenizedId
всегда был связан с этими сериализаторами.
Есть ли способ заставить работать сериализатор / десериализатор при аннотировании надругая аннотация?