问题描述
背景
- 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 (将#修改为@)