关于REST响应和XMLElement

use*_*513 5 java xml rest jaxb xml-parsing

我有一个需要在代码中创建的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>
Run Code Online (Sandbox Code Playgroud)

但是,我得到了

<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>
Run Code Online (Sandbox Code Playgroud)

在响应中.有人可以帮助我如何声明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;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Pau*_*tha 3

@XmlElement(name = "tags")
List<Tag> tags;
Run Code Online (Sandbox Code Playgroud)

它的基本内容是,为列表中的每个项目创建一个名为 的元素<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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后有一个实例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;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者

一个更简单的解决方案就是使用@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;
    }
}
Run Code Online (Sandbox Code Playgroud)