【问题标题】:Substitute complicated combo of annotations with one custom annotation用一个自定义注释替换复杂的注释组合
【发布时间】:2014-01-23 08:14:10
【问题描述】:

在我当前的项目中,我有这组大而复杂的注释,我必须在我的班级周围的很多领域中放置。它们是 Jackson json 注释。

@JsonSerialize(using = IViewableToReferenceSerializer.class, contentUsing = IViewableToReferenceSerializer.class)
private ComplexeObject myObject;

我想将其替换为:

@JsonAsReference 
private ComplexeObject myObject;

我已经在没有自定义注释的情况下测试了系统,它工作正常。我虽然可以将我的注释定义为(例如):

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@JsonSerialize(using = IViewableToReferenceSerializer.class, contentUsing = IViewableToReferenceSerializer.class)
public @interface JsonAsReference {
}

所以我的问题是:这有可能吗?还是我只是做错了什么?

更新:我在这个帖子中找到了杰克逊案例的答案 Create a custom Jackson annotation

但我愿意接受任何一般的案例解决方案。

【问题讨论】:

标签: java annotations


【解决方案1】:

使用默认的 jackson 库,您将没有运气。

这里是来自JacksonAnnotationIntrospector 的代码 sn-p(来自 jackson 1.9.13)

public Object findSerializer(Annotated a) 
{
    /* 21-May-2009, tatu: Slight change; primary annotation is now
     *    @JsonSerialize; @JsonUseSerializer is deprecated
     */
    JsonSerialize ann = a.getAnnotation(JsonSerialize.class);
    if (ann != null) {
        Class<? extends JsonSerializer<?>> serClass = ann.using();
        if (serClass != JsonSerializer.None.class) {
            return serClass;
        }
    }

   ....
}

如您所见,只会考虑注释JsonSerialize。 Jackson 不会像您想要的那样在其他注释上搜索 JsonSerialize 注释。

您可以实现自己的 AnnotationIntrospector 并将其提供给 SerializationConfigDeserializationConfig,例如

AnnotationIntrospector annIntr = ....; // your implementation

ClassIntrospector<? extends BeanDescription> intr = new BasicClassIntrospector();
VisibilityChecker<?> vc = VisibilityChecker.Std.defaultInstance();
TypeFactory typeFactory= TypeFactory.defaultInstance();

SerializationConfig serConfig = new SerializationConfig(intr, annIntr, vc, null,
            null, typeFactory, null);
DeserializationConfig deserConfig = new DeserializationConfig(intr, annIntr, vc, null,
            null, typeFactory, null);

// null means use a default implementation
ObjectMapper objectMapper = new ObjectMapper(null, null, null, serConfig, deserConfig);

【讨论】:

  • 感谢 Rene,但就像我所说的关于杰克逊的特殊情况,我已经找到了一个解决方案……这比你的要简单得多。stackoverflow.com/questions/12921812/…
  • 是的,好的。所以如果你不能使用另一个库,我的回答只是一个提示。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2014-10-08
  • 2011-10-27
  • 1970-01-01
相关资源
最近更新 更多