扩展@JsonDeserialize:Jackson 无法识别自定义注释?

问题描述

背景

  • Spring Boot 2.0.6 应用
  • 杰克逊 2.11.2。

问题

我想使用@JsonDeserialize 将一串值转换成一个值列表,所以我创建了一个自定义反序列化器。 但我希望它支持参数,例如字符串每个值之间的“分隔符”字符。

所以首先我这样做了,而且效果很好:

public class StringListDeserializer extends StdDeserializer<List<String>> implements ContextualDeserializer {

    private static final String DELIMITER_DEFAULT = ",";

    private String delimiter = DELIMITER_DEFAULT;

    public StringListDeserializer() {
        this(null);
    }

    protected StringListDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public List<String> deserialize(JsonParser p,DeserializationContext ctxt) throws IOException,JsonProcessingException {
        String value = p.getText();
        if (StringUtils.isBlank(value)) {
            return null;
        }
        return Arrays.stream(value.split(delimiter))
                .peek(v -> v = v.trim())
                .collect(Collectors.toList());
    }

    @Override
    public JsonDeserializer<?> createContextual(DeserializationContext ctxt,BeanProperty property) throws JsonMappingException {
        Params parameters = property.getMember().getAllAnnotations().get(Params .class);
        if (parameters != null) {
            delimiter = parameters.delimiter();
        }
        return new StringListDeserializer();
    }

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface Params {

        String delimiter() default StringListDeserializer.DELIMITER_DEFAULT;
    }
}
public class MyRequest implements Serializable {

    @JsonDeserialize(using = StringListDeserializer.class)
    @StringListDeserializer.Params(delimiter = ";")
    private List<String> myValue;
}

我不喜欢为了一个目的而操作两个注释,所以我这样做了,但它不起作用:

public class StringListDeserializer extends StdDeserializer<List<String>> implements ContextualDeserializer {

    // Same stuff as before except for the @interface below

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    @JsonDeserialize(using = StringListDeserializer.class)
    public @interface JsonDeserializeStringList {

        String delimiter() default StringListDeserializer.DELIMITER_DEFAULT;
    }
}
public class MyRequest implements Serializable {

    @JsonDeserializeStringList(delimiter = ";")
    private List<String> myValue;
}

当反序列化发生时,Jackson 并没有使用我的自定义反序列化器,就好像它不知道我的自定义注解一样。相反它只是使用他的原生解串器,所以显然它失败了......

那么,是否有 Jackson 配置要做,例如扫描包以获取注释?因为如果杰克逊不是问题,这应该根据以下回复起作用:

@JsonDeserialize 目标类型之一也是明确的“ANNOTATION_TYPE”,所以我真的认为我想要实现的是杰克逊的意图。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)