Search code examples
javajsonannotationsjacksonobjectmapper

ObjectMapper avoid annotation


I have annotations like this:

    @Valid
@NotNull
@JsonTypeResolver(com.rsqtechnologies.sioms.shared.JsonTypeResolver.class)
@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "type",
        visible = true)
@JsonSubTypes({
        @JsonSubTypes.Type(value = HandballPlayerTO.class, name = "handballPlayerTO"),
        @JsonSubTypes.Type(value = FootballPlayerTO.class, name = "footballPlayerTO")
})

And wanna to avoid @JsonTypeResolver during using objectMapper.

I've tried this:

   ObjectMapper mapper = new ObjectMapper();
    JacksonAnnotationIntrospector ignoreJsonTypeInfoIntrospector = new JacksonAnnotationIntrospector() {
        @Override
        protected TypeResolverBuilder<?> _findTypeResolver(
                MapperConfig<?> config, Annotated ann, JavaType baseType) {
            if (!ann.hasAnnotation(JsonTypeResolver.class)) {
                return super._findTypeResolver(config, ann, baseType);
            }
            return null;
        }
    };
    mapper.setAnnotationIntrospector(ignoreJsonTypeInfoIntrospector);

But as I noticed it removes all annotations that appears next to.


Solution

  • The _findTypeResolver method handles @JsonTypeResolver, @JsonTypeInfo and @JsonTypeIdResolver. By overriding this method, you prevent Jackson from processing all of them. Instead of overriding _findTypeResolver, override _findAnnotation so that Jackson can still see the others.

    JacksonAnnotationIntrospector ignoreJsonTypeInfoIntrospector = new JacksonAnnotationIntrospector() {
        protected <A extends Annotation> A _findAnnotation(Annotated annotated, Class<A> annoClass) {
            return JsonTypeResolver.class == annoClass ? null : annotated.getAnnotation(annoClass);
        }
    };