Есть ли способ добавить значения аннотации Джексона из мета-аннотации, аналогично аннотации Spring AliasFor? - PullRequest
0 голосов
/ 30 мая 2018

Мы используем @JacksonAnnotationsInside и хотели бы внедрить свойство из классов с помощью метааннотации.

т.е. у нас есть метааннотация с @JsonTypeInfo() и мы хотели бы внедрить defaultImpl черезагрегирующая аннотация.

Вот аннотация, которую я пытаюсь использовать:

@Inherited
@JacksonAnnotationsInside
@Retention(RetentionPolicy.RUNTIME)
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class") //, defaultImpl=defaultType())
public @interface PolymorphismSupport {
    //@AliasFor("defaultImpl") ...
    Class<?> defaultType() default Object.class;
}

1 Ответ

0 голосов
/ 10 июня 2018

Поддержка типа AliasFor недоступна в Jackson. Но в качестве обходного пути мы можем изменить потребление метаданных, предоставленных аннотацией, добавив JacksonAnnotationIntrospector.

То, что вы естьпопытка достичь может быть выполнена путем предоставления пользовательского JacksonAnnotationIntrospector, который будет предоставлять реализацию по умолчанию из аннотации PolymorphismSupport.

@Inherited
@JacksonAnnotationsInside
@Retention(RetentionPolicy.RUNTIME)
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
public @interface PolymorphismSupport {

    Class<?> defaultType() default Object.class;

}

public class CustomAnnotationIntrospector extends JacksonAnnotationIntrospector {

    @Override
    protected TypeResolverBuilder<?> _findTypeResolver(MapperConfig<?> config, Annotated ann, JavaType baseType) {
        TypeResolverBuilder<?> b = super._findTypeResolver(config, ann, baseType);
        PolymorphismSupport support = _findAnnotation(ann, PolymorphismSupport.class);
        if (null != b && null != support) {
            b.defaultImpl(support.defaultType());
        }
        return b;
    }
}


public class CustomObjectMapper extends ObjectMapper {

    public CustomObjectMapper() {
        setAnnotationIntrospector(new CustomAnnotationIntrospector());
    }
}

Единственным недостатком этого подхода является то, что вам необходимо зарегистрировать интроспектор вобъект сопоставления при инициализации.

...