Jaxb2Marshaller和属性

时间:2010-09-23 14:50:57

标签: java spring xml-serialization jaxb

使用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。

1 个答案:

答案 0 :(得分:2)

默认情况下,XML中的属性不使用其父元素的命名空间限定。

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

item元素的名称空间为foo,但id属性没有。{/ p>

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

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