java - 用一个自定义注释替换复杂的注释组合

标签 java annotations

在我当前的项目中,我有这组又大又复杂的注释,我必须在类(class)的很多字段上添加这些注释。它们是 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 {
}

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

更新:我在这个帖子中找到了针对特定 jackson 案例的答案 Create a custom Jackson annotation

但我对任何一般案例解决方案持开放态度。

最佳答案

使用默认的 Jackson 库,你不会有好运。

这里是来自 JacksonAnnotationIntrospector 的代码片段(来自 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);

关于java - 用一个自定义注释替换复杂的注释组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21302747/

相关文章:

spring - 在自定义注释的方面传递方法参数

java - 方法上可以加注解吗

scala - 使用空参数从Scala调用Java API

java - 使用 Stream 读取文件并跟踪当前索引

java - 回滚事务功能是否仅在抛出异常时才起作用?

java - @MustOverride 注释?

maven-compiler-plugin 指定 fork=true 时不做注解处理?

java - 在 gui 中显示文本的最简单方法?

java - 插入语句在java中不起作用

java - JMS 客户端工具 - Java 8 的 HermesJMS 的替代品?