我们正在使用@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;
}
答案 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注册到对象映射器中。