3

我需要使用 jackson-dataformat-xml 将一些 XML 文件反序列化为常规 java 对象。所以我在做:

import com.fasterxml.jackson.dataformat.xml.XmlMapper;

XmlMapper mapper = new XmlMapper();
return mapper.readValue(xmlString, Certificate.class);

xmlString出现:

    <?xml version="1.0" encoding="UTF-8"?>
    <doc>
        <r  key="0">
            <ATT_SEARCH DM="dm1" DS="ds1" DocType="1"/>
            <ATT_SEARCH DM="dm2" DS="ds2" DocType="2"/>
        </r>
    </doc>

和类证书:

package ua.max;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import java.util.List;


@JacksonXmlRootElement(localName = "doc")
@XmlAccessorType(XmlAccessType.FIELD)
public class Certificate {

    @JacksonXmlProperty(localName = "r")
    private R r;

    public R getR() {
        return r;
    }

    public void setR(R r) {
        this.r = r;
    }


    public class R {

        @JacksonXmlProperty(localName = "ATT_SEARCH")
        @JacksonXmlElementWrapper(useWrapping = false)
        private List<AttSearch> attSearch;

        public List<AttSearch> getAttSearch() {
            return attSearch;
        }

        public void setAttSearch(List<AttSearch> attSearch) {
            this.attSearch = attSearch;
        }

        @JacksonXmlProperty(isAttribute = true, localName = "key")
        private String key;

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }


        public class AttSearch {

            @JacksonXmlProperty(isAttribute = true, localName = "DM")
            private String dm;

            @JacksonXmlProperty(isAttribute = true, localName = "DS")
            private String ds;

            @JacksonXmlProperty(isAttribute = true, localName = "DocType")
            private String docType;


            public String getDm() {
                return dm;
            }

            public void setDm(String dm) {
                this.dm = dm;
            }

            public String getDs() {
                return ds;
            }

            public void setDs(String ds) {
                this.ds = ds;
            }

            public String getDocType() {
                return docType;
            }

            public void setDocType(String docType) {
                this.docType = docType;
            }


        }


    }


}

在尝试取消实现 XML 后,我得到了异常:
“没有为类型 [简单类型,类 ua.max.Certificate$R] 找到合适的构造函数:无法从 JSON 对象实例化”

我的尝试:
1. 如果我为我的内部类添加修饰符“static”,它正在工作,我得到 java 对象,但除了 2 个对象列表“ATT-SEARCH”之外,我得到的第一个是 null
2. 添加不同的构造函数确实不产生任何影响

4

1 回答 1

3

R并且AttSearch应该是静态的:

 public static class R {
   // other stuff

 public static class AttSearch {
   // other stuff

否则编译器会创建以外部类引用为参数的默认构造函数,因此fasterxml找不到没有参数的构造函数并创建pojo。

于 2013-08-22T08:27:09.427 回答