关于REST响应和XMLElement

时间:2014-10-14 20:13:25

标签: java xml rest xml-parsing jaxb

我有一个需要在代码中创建的REST响应:

<sample>
   <tags> 
       <tag>
           <name>ABC</name>
           <Date>2014-10-14T12:30:05Z</ingress>
       </tag>
       <tag>
           <name>DEF</name>
           <Date>2014-10-14T12:30:05Z</ingress>
       </tag>
   </tags>
</sample>

然而,我正在

<sample>
    <tags>           
        <name>ABC</name>
        <Date>2014-10-14T12:30:05Z</ingress>
    </tags>
    <tags>
        <name>DEF</name>
        <Date>2014-10-14T12:30:05Z</ingress>        
    </tags>
</sample>

在响应中。有人可以帮助我如何声明Java类以获得所需的REST响应吗?

这是java代码:

@XmlRootElement(name = "sample")
public class Sample {
    private List<Tag> tags;

    @XmlElement(name = "tags")
    public List<Tag> getTags() {
        return tags;
    }

    /**
     * @param tags
     *            the tags to set
     */
    public void setTags(List<Tag> tags) {
        this.tags = tags;
    }

}

@XmlRootElement(name = "tag")
public class Tag {
    private String name;
    private Date date;

    /**
     * @return the name
     */
    @XmlElement(name = "name")
    public String getName() {
        return name;
    }

    /**
     * @param name
     *            the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the date
     */
    @XmlElement(name = "date")
    public Date getDate() {
        return date;
    }

    /**
     * @param date
     *            the date to set
     */
    public void setDate(Date date) {
        this.date = date;
    }
}

由于

2 个答案:

答案 0 :(得分:3)

@XmlElement(name = "tags")
List<Tag> tags;

它基本上读取列表中的每个项目,创建一个名为<tags>的元素。所以从本质上讲,你拥有的是<subject>元素包装多个<tags>

获得另一个“上层”元素的几个选项

您可以创建一个“高级”类来表示,例如Tags

public class Tags {
    protected List<Tag> tags;

    @XmlElement(name = "tag")
    public List<Tag> getTags() {
        if (tags == null) {
            tags = new ArrayList<>();
        }
        return tags;
    }

    public void setTags(List<Tag> tags) {
        this.tags = tags;
    }
}

然后将Tags的实例作为Sample

的属性
@XmlRootElement(name = "sample")
public class Sample {
    private Tags tags;

    @XmlElement(name = "tags")
    public void setTags(Tags tags) {
        this.tags = tags;
    }

    public Tags getTags() {
        return tags;
    }
}

更简单的解决方案就是使用@XmlElementWrapper

  

围绕XML表示生成包装元素。这主要用于生成集合

的包装XML元素

使用原始代码,您可以简单地将注释添加到列表

@XmlRootElement(name = "sample")
public class Sample {
   private List<Tag> tags;

    @XmlElementWrapper(name = "tags")
    @XmlElement(name = "tag")
    public List<Tag> getTags() {
        if (tags == null) {
            tags = new ArrayList<>();
        }
        return tags;
    }

    public void setTags(List<Tag> tags) {
        this.tags = tags;
    }
}

答案 1 :(得分:1)

您只需使用@XmlElementWrapper注释即可将分组元素添加到您的收藏中。

@XmlElementWrapper
@XmlElement(name = "tag")
public List<Tag> getTags() {
    return tags;
}

注意: @XmlElement适用于集合中的每个项目。