【问题标题】:can not bind xml to pojo using jackson, com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field无法使用 jackson 将 xml 绑定到 pojo,com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段
【发布时间】:2019-08-23 11:11:16
【问题描述】:

虽然我尝试使用 jackson 将 xml 响应绑定到 POJO,但我希望使用 getter 获取值。但我得到错误一个错误。我尝试搜索此内容,但找不到相关信息。大多数人建议使用忽略。但是我不能因为我期待那个领域。我的 pojo 如下所示。

public class Consumer {
    private String xmlns;
    private String version;
    private Info info;
    private Status status;

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    public Info getInfo() {
        return info;
    }

    public void setInfo(Info info) {
        this.info = info;
    }

    public String getXmlns() {
        return xmlns;
    }

    public void setXmlns(String xmlns) {
        this.xmlns = xmlns;
    }

    public String getVersion() {
        return version;
    }

    public class Info {
        private String state;
        private String id;
        private String shopId;
        private String time;

        public String getState() {
            return state;
        }

        public void setState(String state) {
            this.state = state;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getShopId() {
            return shopId;
        }

        public void setShopId(String shopId) {
            this.shopId = shopId;
        }

        public String getTime() {
            return time;
        }

        public void setTime(String time) {
            this.time = time;
        }


    public class Status {
        private Response response;

        public Response getResponse() {
            return response;
        }

        public void setResponse(Response response) {
            this.response = response;
        }


    public class Response {
        private String value;
        private int statusCode;
        private String messageCode;

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }

        public int getStatusCode() {
            return statusCode;
        }

        public void setStatusCode(int statusCode) {
            this.statusCode = statusCode;
        }

        public String getMessageCode() {
            return messageCode;
        }

        public void setMessageCode(String messageCode) {
            this.messageCode = messageCode;
        }


    public class Temp {

        public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, JAXBException {
            readXml();
        }

        public static void readXml() throws IOException, SAXException, ParserConfigurationException, JAXBException {
            String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                    "<Consumer xmlns=\"http://www.someurl.com\" version=\"1.5\">\n" +
                    "   <Info state=\"CA\">\n" +
                    "      <Id>160c464da1ad89a2fec50436</Id>\n" +
                    "      <ShopId>1234</ShopId>\n" +
                    "      <time>2019-08-22T23:13:47.909-04:00</time>\n" +
                    "   </Info>\n" +
                    "   <Status>\n" +
                    "      <Response value=\"Success\" statusCode=\"3456\" messageCode=\"Request processed successfully\" />\n" +
                    "   </Status>\n" +
                    "</Consumer>";

            XmlMapper xmlMapper = new XmlMapper();
            Consumer consumer = xmlMapper.readValue(xmlString, Consumer.class);

            System.out.println("Shop id "+consumer.getInfo().getShopId());

        }

    Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Info" (class com.motivatedmind.api.stackoverflow.Consumer), not marked as ignorable (3 known properties: "version", "xmlns", "info"])
     at [Source: (StringReader); line: `enter code here`3, column: 21] (through reference chain: com.motivatedmind.api.stackoverflow.Consumer["Info"])
        at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)
        at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:823)
        at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1153)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1589)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1567)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:294)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4014)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3005)

【问题讨论】:

    标签: java xml jackson-dataformat-xml


    【解决方案1】:

    我怀疑问题出在 XML 字符串本身。

    &lt;Consumersumer&gt; 更改为&lt;Consumer&gt;,应该可以。

    ----------- 更新后------------

    为什么state 作为属性传递给 XML 标记“信息”..? 它应该匹配 &lt;Info&gt; 的子代作为 POJO 类 Info.java 的实例值。

    状态是POJO中的实例变量,但不是&lt;info&gt;标签中的子标签。

    String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "<Consumer xmlns=\"http://www.someurl.com\" version=\"1.5\">\n" +
                "   <Info>\n" +
                "      <State>CA</State>\n" +
                "      <Id>160c464da1ad89a2fec50436</Id>\n" +
                "      <ShopId>1234</ShopId>\n" +
                "      <time>2019-08-22T23:13:47.909-04:00</time>\n" +
                "   </Info>\n" +
                "   <Status>\n" +
                "      <Response value=\"Success\" statusCode=\"3456\" messageCode=\"Request processed successfully\" />\n" +
                "   </Status>\n" +
                "</Consumer>";
    

    试试这个..!!

    ------评论更新后---------

    当您从其他服务获取数据(xml 字符串)时。您可以更改模型对象以匹配 xml 数据。

    为此,您可以在 pojo 中 state 字段的 setter 方法上使用注解 @XmlAttribute

    更多参考可以看this answer

    【讨论】:

    • 嘿,谢谢。这就是我从 api [状态作为属性] 接收响应的方式。我要做的就是使用从 api 收到的响应。
    • 我尝试了以下两种方法。但运气不好,它说同样的错误@JacksonXmlProperty(isAttribute = true) public String getState() { return state; } @javax.xml.bind.annotation.XmlAttribute public String getState() { 返回状态; }
    猜你喜欢
    • 2014-06-21
    • 2016-04-13
    • 2016-01-26
    • 1970-01-01
    • 2021-02-11
    • 2016-10-09
    • 2020-10-30
    • 2016-10-25
    • 2015-04-24
    相关资源
    最近更新 更多