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

    问题解决。

  • 相关阅读:
    ABP文档
    ABP框架没有httpPost,httpget,httpput特性
    使用命令关闭占用80端口的程序
    nginx安装编译详解
    docker端口映射设置
    centos6.3安装nginx
    process有个env属性,env属性就是环境变量,里面可以访问到NODE_ENV;NODE_ENV是在启动nodejs时添加上去的;
    使用nssm在windows服务器上部署nodejs
    对象相等与不相等
    可用的CSS文字两端对齐
  • 原文地址:https://www.cnblogs.com/wugang/p/15155804.html
Copyright © 2020-2023  润新知