【问题标题】:Jaxb2Marshaller and attributesJaxb2Marshaller 和属性
【发布时间】:2010-09-23 14:50:57
【问题描述】:

我在使用 Jaxb2Marshaller 解组 XML 属性(原始类型)时遇到问题。 这是示例:

<?xml version="1.0" encoding="UTF-8"?>
<request xmlns="...">
    <items>
        <item id="1"/>
        <item id="2"/>
        <item id="3"/>
    </items>
</request>

而实体类是:

@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlRootElement(name = "request", namespace = "...")
@XmlType(name = "Request", namespace = "...")
public class Request {

    private List<Item> _items;

    @XmlElementWrapper(name = "items", namespace = "...")
    @XmlElement(name = "item", namespace = "...")
    public List<Item> getItems() {
      return _items;
    }

    public void setItems(List<Item> items) {
      _items= items;
    }

    @XmlType(name = "Item", namespace = "...")
    public static class Item {

        private Long _id;

        @XmlAttribute(name = "id", namespace = "...")
        public Long getId() {
          return _id;
        }

        public void setId(Long id) {
          _id = id;
        }
    }
}

解组后,我有 request.getItems().iterator().next().getId() == null 而它应该是 1。如果我使用嵌套元素而不是属性,一切都很好。怎么可能修好?我不想为所有原始 Java 类型编写一批 XmlAdapter。

【问题讨论】:

    标签: java spring xml-serialization jaxb


    【解决方案1】:

    默认情况下,XML 中的属性不符合其父元素的命名空间。所以对于

    <item id="3" xmlns="foo"/>
    

    item 元素具有命名空间 foo,但 id 属性没有。

    要解决您的问题,您只需从 getId() 方法中删除 namespace 声明:

    @XmlAttribute(name = "id")
    public Long getId() {
       return _id;
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2014-12-15
    相关资源
    最近更新 更多