换行符满足时不能反序列化标记中的空内容

gab6jxml  于 2021-07-04  发布在  Java
关注(0)|答案(1)|浏览(477)

有以下两个课程:

@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Structure {
    @JacksonXmlProperty
    private Info info;

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@NoArgsConstructor
@AllArgsConstructor
public class Info{
    private Subinfo subinfo;
}

进行反序列化,如:

private static final XmlMapper XML_MAPPER = new XmlMapper();
 Structure structure = XML_MAPPER.readValue(input, Structure.class);

哪里 input 是我的xml(见下文)
出现异常:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.test.models.Info` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('

    ')

此功能没有帮助:

XML_MAPPER.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

我的xml失败:

<?xml version='1.0' encoding='UTF-8' ?>
  <Structure>
    <Info>

    </Info>
  </Structure>

对于此xml,反序列化工作正常:

<?xml version='1.0' encoding='UTF-8' ?>
  <Structure>
    <Info/>
  </Structure>

问题在于标签关闭方法: <Info/>
<Info/> 工作正常,而

<Info>

 </Info>

发生行终止符时导致异常

eaf3rand

eaf3rand1#

正如其他人在评论中已经提到的, DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT 只将空字符串转换为null,但info元素中有空格和行分隔符。
其他人无法重现你的问题,因为你要么没有提到你也使用了 XML_MAPPER.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true) 在代码或示例中的信息中,xml实际上应该是info,否则元素将被忽略。
要处理空字符串和仅包含空格和/或行分隔符的字符串,可以在解析xml之前添加以下代码:

XML_MAPPER.addHandler(new DeserializationProblemHandler() {

    @Override
    public Object handleMissingInstantiator(DeserializationContext ctxt, Class<?> instClass,
            ValueInstantiator valueInsta, JsonParser p, String msg) throws IOException {

      String value = p.getValueAsString();

      // ignore "empty" Info elements
      if (instClass.isAssignableFrom(Info.class) && (value.isEmpty() || value.matches("[\n\s]+"))) {
        return null;
      }
      return super.handleMissingInstantiator(ctxt, instClass, valueInsta, p, msg);
    }

});

如果要对所有元素执行此操作,可以忽略 instClass

相关问题