Java 遇到换行符时无法反序列化标记中的空内容

Java 遇到换行符时无法反序列化标记中的空内容,java,xml,jackson,deserialization,newline,Java,Xml,Jackson,Deserialization,Newline,有以下两种课程: @Data @AllArgsConstructor @NoArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) public class Structure { @JacksonXmlProperty private Info info; @Data @JsonIgnoreProperties(ignoreUnknown = true) @NoArgsConstructor @AllArgsC

有以下两种课程:

@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>

问题在于标签关闭方法:
VS

工作正常 当



当行终止符出现时引发异常

正如其他人在其注释中已经提到的那样,
反序列化功能。接受“空字符串”作为“空字符串”对象
仅将空字符串转换为空字符串,但您的Info元素中有空格和行分隔符

其他人无法重现您的问题,因为您没有提到您也在代码或示例中使用了
XML\u映射器.configure(MapperFeature.ACCEPT\u CASE\u INSENSITIVE\u 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);
    }
   
});
XML\u MAPPER.addHandler(新的反序列化ProblemHandler(){
@凌驾
公共对象HandleMissingInstallator(反序列化上下文ctxt,类instClass,
ValueInstantiator valueInsta、JSONP、字符串msg)引发IOException{
字符串值=p.getValueAsString();
//忽略“空”信息元素
if(instClass.isAssignableFrom(Info.class)&&(value.isEmpty()| | value.matches(“[\n\s]+”)){
返回null;
}
返回超级HandleMissingInstallator(ctxt、instClass、valueInsta、p、msg);
}
});

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

是一个空字符串<代码>是一个空字符串<代码>不是空字符串,因为它由空格字符组成。在您的示例中,它似乎由一个行终止符(
\n
\r\n
,具体取决于操作系统)和4个空格组成。@Andreas您是对的,这是我的输入,问题在于功能
反序列化功能。接受空字符串作为空字符串对象
在这里不起作用抱歉,Jackson只处理空字符串,而不是空字符串。如果您需要,您必须自己编写一些反序列化逻辑。您能提供一个最小的git吗?我的代码工作很好两个都很好@sergionni
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);
    }
   
});