在我当前的项目中,我有这组又大又复杂的注释,我必须在类(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 并将其提供给 SerializationConfig
和 DeserializationConfig
,例如
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/