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;
    }
    
    

    问题解决。

  • 相关阅读:
    51nod数字1的数量
    bzoj3669: [Noi2014]魔法森林 lct版
    【NOI2014】起床困难综合症 位运算+贪心
    bzoj2631: tree lct
    bzoj2002 弹飞绵羊 lct版
    codevs1245最小的N个和 小根堆
    RTSP/GB28181/SDK协议视频融合平台EasyCVR接口获取协议平台接入参数的调用方法
    RTSP/GB28181/SDK协议视频融合平台EasyCVR上传通道数据库不显示怎么解决?
    基于视频协议融合平台EasyCVR开发的视频综合管理监控平台EasyCVS通道流检查功能的实现
    RTSP/GB28181/HIKSDK/大华SDK协议安防视频云平台EasyCVR新增告警功能介绍
  • 原文地址:https://www.cnblogs.com/wugang/p/15155804.html
Copyright © 2011-2022 走看看