如何使用@XmlElement注释列表?

我使用javax.xml.bind.annotation.XmlElement有以下注释:

 @XmlElement public List getKeywords() { return keywords; } 

当我编写一些示例内容时,会产生以下XML:

 keyword1 keyword2 

我想获得以下XML:

  keyword1 keyword2  

我应该使用什么样的注释?

我试过了

 @XmlElementWrapper @XmlElement(name="keyword") 

但随后整个内容消失,结果是:

  

如果我只尝试重命名元素,也会发生同样的情况:

 @XmlElement(name="keyword") 

我究竟做错了什么?

更新:

这是根据第一个答案更新的类的完整代码,但它仍然无效(当编组为XML时,结果是一个空列表 ):

 import java.util.List; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Content { private List keywords; public Content() {} @XmlElementWrapper(name="keywords") @XmlElement(name="keyword") public List getKeywords() { return keywords; } public void setKeywords(List keywords) { this.keywords = keywords; } } 

我也尝试了以下相同的结果:

 import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Content { @XmlElementWrapper(name="keywords") @XmlElement(name="keyword") private List keywords; public Content() {} public List getKeywords() { return keywords; } public void setKeywords(List keywords) { this.keywords = keywords; } } 

但是,关键字不为空,因为以下产生keyword1keyword2而不是空列表:

 import java.util.List; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Content { private List keywords; public Content() {} @XmlElement public List getKeywords() { return keywords; } public void setKeywords(List keywords) { this.keywords = keywords; } } 

编组的代码是(JAX-RS):

 import java.io.StringWriter; import javax.ws.rs.Consumes; import javax.ws.rs.Path; import javax.ws.rs.POST; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; @Path("process") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_XML) public class ContentHandler { @POST public Response process(Content content) { StringWriter stringWriter = new StringWriter(); try { JAXBContext jaxbContext = JAXBContext.newInstance(Content.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); jaxbMarshaller.marshal(content, stringWriter); } catch (JAXBException e) { return Response.serverError().entity(e.getMessage()).build(); } return Response.ok(stringWriter.toString(), MediaType.APPLICATION_XML).build(); } } 

您需要利用@XmlElementWrapper@XmlElement

Java模型

内容

 import java.util.List; import javax.xml.bind.annotation.*; @XmlRootElement public class Content { private List keywords; public Content() {} @XmlElementWrapper @XmlElement(name="keyword") public List getKeywords() { return keywords; } public void setKeywords(List keywords) { this.keywords = keywords; } } 

演示代码

演示

 import java.util.*; import javax.xml.bind.*; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Content.class); List strings = new ArrayList(2); strings.add("foo"); strings.add("bar"); Content content = new Content(); content.setKeywords(strings); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(content, System.out); } } 

产量

    foo bar   

欲获得更多信息

以下是我博客中提供附加信息的几篇文章的链接:

使用此表格:

 @XmlElementWrapper(name="keywords") @XmlElement(name="keyword") 

请注意,如果keywords 为空,那么您将获得

有时您需要将@XmlRootElement添加到您的类(取决于上下文)和@XmlAccessorType(XmlAccessType.?)注释。 我通常使用@XmlAccessorType(XmlAccessType.FIELD)并使用@XmlElement注释我的字段

以上回答 – Blaise Doughan是完全正确的

另一种简单的方法是,即使你不写 – @XmlElementWrapper

  private List keywords; @XmlElementWrapper @XmlElement(name="keyword") public List getKeywords() { return keywords; } 

您可以这样使用它 – 在Class级别编写XmlAccessorType,然后XML元素名称将与类成员名称相同 – 关键字

 import java.util.List; import javax.xml.bind.annotation.*; @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Content { private List keywords; public Content() {} public List getKeywords() { return keywords; } public void setKeywords(List keywords) { this.keywords = keywords; } }