zoukankan      html  css  js  c++  java
  • Jakson反序列化XML异常

    com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.travelsky.dto.av.rs.Seg` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('1')
     at [Source: (StringReader); line: 1, column: 242] (through reference chain: com.travelsky.dto.av.rs.OTA_AVE_RS["Response"]->com.travelsky.dto.av.rs.Out1["segs"]->com.travelsky.dto.av.rs.Segs["seg"]->java.util.ArrayList[0])
    	at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
    	at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1455)
    

    模型为:

    @XmlRootElement(name = "seg")
    @AllArgsConstructor
    @NoArgsConstructor
    @JacksonXmlRootElement(localName = "seg")
    @Data
    public class Seg {
        @JsonProperty("routno")
        private String routno;
        @JsonProperty("subid")
        private String subid;
        //其他字段忽略
    }
    

    从异常信息上看起来是在提示Seg包含没有String参数的构造函数,但是因为我用了Lombok,使用了AllArgsConstructor注解,理论不上存在该问题。

    于是查看MismatchedInputException异常,发现只有在xml反序列化结构匹配不上时才会抛出,于是设置xmlMapper的属性:

    @Bean(name = "xmlMapper")
    public XmlMapper jacksonXmlMapper() {
        XmlMapper mapper = new XmlMapper();
        mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
        mapper.configure(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT,true);
        mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL,true);
        return mapper;
    }
    

    重试后问题依旧存在。

    于是上网搜索该异常可能的情况,最后在https://blog.csdn.net/neweastsun/article/details/100044167 一文中发现是模型定义的有一些问题。
    问题不是出在Seg上,而是在Seg的上一级Segs。其最初的模型如下:

    @XmlRootElement(name = "segs")
    @JacksonXmlRootElement(localName = "segs")
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    public class Segs {
        private List<Seg> seg;
    }
    
    

    修改成:

    @XmlRootElement(name = "segs")
    @JacksonXmlRootElement(localName = "segs")
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    public class Segs {
        @JacksonXmlElementWrapper(useWrapping = false)
        private List<Seg> seg;
    }
    
    

    问题解决。

  • 相关阅读:
    Django的高级用法
    Django信号和缓存
    初识Django框架
    虚拟化之KVM(上)
    jQuery操作页面-day13
    SSM整合
    新闻发布系统
    jsp
    分层
    简单工厂
  • 原文地址:https://www.cnblogs.com/wugang/p/15155804.html
Copyright © 2011-2022 走看看