【发布时间】:2019-11-13 04:15:33
【问题描述】:
我正在尝试创建一个自定义注释来标记一个给定的属性,当它被注释时,所以我有以下结构:
@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;
但是当我这样使用时它们会起作用(从@TokenizedId 中删除@JsonSerialize 和@JsonDeserialize):
@JsonSerialize(using = IdToTokenSerializer.class)
@JsonDeserialize(using = TokenToIdDeserializer.class)
@TokenizedId(MyClass.class)
private Long id;
我个人不喜欢这种方法,因为开发人员在想要标记某些 id 时需要始终记住使用这三个注释,而且我希望 @TokenizedId 始终与这些序列化程序相关。
有没有办法让序列化器/反序列化器在另一个注释上注释时工作?
【问题讨论】:
标签: java spring-boot jackson serialization