gpt4 book ai didi

java - 有没有办法从元注释中注入(inject) Jackson 注释值,类似于 Spring 的 AliasFor 注释?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:35:24 24 4
gpt4 key购买 nike

我们正在使用 @JacksonAnnotationsInside 并希望使用元注释从类中注入(inject)一个属性。

即我们有一个带有 @JsonTypeInfo() 的元注解,并希望通过聚合注解注入(inject) 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;
}

最佳答案

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());
}
}

这种方法的唯一缺点是您必须在初始化时将内省(introspection)器注册到对象映射器中。

关于java - 有没有办法从元注释中注入(inject) Jackson 注释值,类似于 Spring 的 AliasFor 注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50612607/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com