如何使用@XmlIDREF与@XmlID编组嵌套集合?
使用JAXB处理集合与实体关联的配置示例
我来整理一下你提到的JAXB相关配置和代码,方便你参考使用:
1. Maven依赖配置
首先是你用到的Jersey JAXB媒体模块依赖,在pom.xml中添加:
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-jaxb</artifactId> <version>2.23.2</version> </dependency>
2. 集合包装类定义
这个包装类用于将List<TrainingEntity>序列化为XML根元素<trainings>:
import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "trainings") public class ArrayListWrapper { private List<TrainingEntity> trainings = new ArrayList<>(); // Getter方法 public List<TrainingEntity> getTrainings() { return trainings; } // Setter方法 public void setTrainings(List<TrainingEntity> trainings) { this.trainings = trainings; } }
3. TrainingEntity中的关联属性配置
你提到的TrainingEntity类里使用@XmlIDREF和@XmlElementWrapper来处理与ArticleEntity的集合关联,示例代码如下:
import java.util.Set; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlIDREF; public class TrainingEntity { // 其他属性... @XmlIDREF @XmlElementWrapper(name = "articles") // 可选:指定包装元素名,生成<articles>包裹子元素 private Set<ArticleEntity> articles; // Getter和Setter方法 public Set<ArticleEntity> getArticles() { return articles; } public void setArticles(Set<ArticleEntity> articles) { this.articles = articles; } }
补充说明
- @XmlRootElement(name = "trainings"):指定当前类在XML中的根元素名称为
<trainings>,让JAXB能正确识别并序列化/反序列化整个集合包装对象。 - @XmlIDREF:这个注解会让JAXB序列化时只输出关联实体的ID引用,而不是整个实体的XML内容,常用于处理实体间的关联关系,避免循环引用和冗余数据。注意对应的
ArticleEntity类需要有一个用*@XmlID*标注的属性作为唯一标识。 - @XmlElementWrapper:用于为集合属性生成一个包装元素,比如上面的配置会生成
<articles>标签来包裹所有关联的实体引用元素,让XML结构更清晰。
内容的提问来源于stack exchange,提问作者Marcin Warycha
相关产品推荐
相关产品推荐

