【发布时间】:2019-10-21 23:54:23
【问题描述】:
我正在尝试创建一些杰克逊可序列化的类。我想用标准的 Jackson 注释来注释一些元素(让我们在这个例子中考虑JsonIgnore),但我希望它们只在我的特定映射器中生效。
所以我决定创建自己的注释,如标准注释(例如 MyJsonIgnore),并仅在我的映射器使用的注释内省器中处理它们。我找到了可覆盖的方法_findAnnotation。 Javadoc 说明如下:
...overridable that sub-classes may, if they choose to,
mangle actual access block access ("hide" annotations)
or perhaps change it.
我找到了一种阻止某些注释的方法(但是它涉及覆盖_hasAnnotation,而不是_findAnnotation),但我完全被更改注释所困扰。
这是我正在尝试做的一些最小示例:
object Mappers {
/**
* Same as JsonIgnore but mapper-specific
*/
annotation class MyJsonIgnore(val value: Boolean = true)
private class MyIntrospector : JacksonAnnotationIntrospector() {
override fun <A : Annotation> _findAnnotation(
annotated: Annotated,
annoClass: Class<A>
): A {
if (annoClass == JsonIgnore::class.java && _hasAnnotation(annotated, MyJsonIgnore::class.java)) {
val mji = _findAnnotation(annotated, MyJsonIgnore::class.java)
return JsonIgnore(mji.value) // Does not compile, type mismatch
// return JsonIgnore(mji.value) as A // Does not compile, annotation class cannot be instantiated, same as Java, see below
}
return super._findAnnotation(annotated, annoClass)
}
}
fun myMapper(): ObjectMapper {
return ObjectMapper().setAnnotationIntrospector(MyIntrospector())
}
}
我也不能用 Java 做到这一点:
public class Mappers {
/**
* Same as JsonIgnore but mapper-specific
*/
public @interface MyJsonIgnore {
boolean value() default true;
}
private static class MyIntrospector extends JacksonAnnotationIntrospector {
@Override
protected <A extends Annotation> A _findAnnotation(Annotated annotated,
Class<A> annoClass) {
if (annoClass == JsonIgnore.class && _hasAnnotation(annotated, MyJsonIgnore.class)) {
MyJsonIgnore mji = _findAnnotation(annotated, MyJsonIgnore.class);
return new JsonIgnore(mji.value()); // Does not compile, JsonIgnore is abstract
}
return super._findAnnotation(annotated, annoClass);
}
}
static ObjectMapper myMapper() {
return new ObjectMapper().setAnnotationIntrospector(new MyIntrospector())
}
}
那么通过覆盖此方法来更改注释的假定方法是什么?有没有?我的方法是正确的还是应该以其他方式做?
【问题讨论】:
标签: java kotlin jackson annotations