有没有办法在mapper配置而不是注释上指定@JsonTypeIdResolver?

时间:2013-06-11 18:08:22

标签: jackson

有没有办法在mapper配置上指定@JsonTypeIdResolver而不是注释目标类? 例如,而不是:

@JsonTypeInfo(  
    use = JsonTypeInfo.Id.CUSTOM,  
    include = JsonTypeInfo.As.PROPERTY,  
    property = "@type") 
@JsonTypeIdResolver(FooTypeIdResolver.class)        
public class Foo {

}

只有

@JsonTypeInfo(  
    use = JsonTypeInfo.Id.CUSTOM,  
    include = JsonTypeInfo.As.PROPERTY,  
    property = "@type") 
public class Foo {

}

在mapper上执行以下操作

mapper.getSerializationConfig()
.with(new JacksonAnnotationIntrospector())
.without(SerializationFeature.INDENT_OUTPUT);
...
// something like this :
.addTypeIdResolver(Foo.class, FooTypeIdResolver.class)

我问这个是因为FooTypeIdResolver位于不同的“库”上,Foo库不能依赖它......

2 个答案:

答案 0 :(得分:3)

您可以使用杰克逊的mix-in annotations,在您的情况下,您首先要创建一个包含您要添加的注释的类:

@JsonTypeIdResolver(FooTypeIdResolver.class)
private static class FooMixIn {

}

然后你会将这个混合应用到Foo类(粗略地说这会在FooMixIn上显示注释并将它们应用到Foo

mapper.getSerializationConfig().addMixInAnnotations(Foo.class, FooMixIn.class);
mapper.getDeserializationConfig().addMixInAnnotations(Foo.class, FooMixIn.class);

答案 1 :(得分:3)

定义自定义AnnotationIntrospector可以覆盖所有注释的处理:通常通过扩展默认JacksonAnnotationIntrospector。然后,这可以使用您想要的任何备用数据源。

混合注释是另一种明显的方法,如公认的答案所述。