如何使用@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; } }