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

时间:2018-05-30 20:05:19

标签: java spring jackson annotations

我们正在使用@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 :(得分:1)

Jackson中没有AliasFor类支持。但作为一种解决方法,我们可以通过扩展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()); } } 注释的默认实现。

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
void setup() {
  Serial.begin(115200);
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.setDataRate(RF24_250KBPS);
  radio.stopListening();
}



void loop() {
  const char text[] = "hhh\0";
  radio.write(&text, sizeof(text));
  delay(5000);
}

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