java如何在JAXB集合解组中使用setter
我不想将XML反序列化到我的POJO中,但有些地方做错了
我的POJO课程:
@Builder
@ToString
@AllArgsConstructor
@NoArgsConstructor
@XmlRootElement(name="taxi")
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlType(propOrder = {"id", "name", "phone", "citiesId"})
public class TaxiEntity {
@Getter @Setter
private Integer id;
@Getter @Setter
private String name;
@Getter @Setter
private String phone;
@Singular("city")
private Set<Integer> citiesId = new HashSet<>();
@XmlElementWrapper(name="cities_id")
@XmlElement(name="city_id")
public void setCitiesId(Set<Integer> citiesId) {
System.out.println("setCitiesId()");
this.citiesId = citiesId;
}
public Set<Integer> getCitiesId() {
System.out.println("getCitiesId()");
return new HashSet<>(citiesId);
}
}
编组示例:
JAXBContext context = JAXBContext.newInstance(TaxiEntity.class);
TaxiEntity entity = TaxiEntity.builder().
id(5).
name("my city").
phone("12345678").
city(1).
city(5).
build();
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(entity, new File("entity.xml"));
XML输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<taxi>
<id>5</id>
<name>my city</name>
<phone>12345678</phone>
<cities_id>
<city_id>1</city_id>
<city_id>5</city_id>
</cities_id>
</taxi>
解组示例:
JAXBContext context = JAXBContext.newInstance(TaxiEntity.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
TaxiEntity entity = (TaxiEntity) unmarshaller.unmarshal(new File("entity.xml"));
System.out.println(entity);
控制台输出:
getCitiesId()
getCitiesId()
TaxiEntity(id=5, name=my city, phone=12345678, citiesId=[])
Process finished with exit code 0
如您所见,citiesId为空。 这是因为JAXB解组调用getter(在我的例子中是字段的副本) 并尝试将值设置到集合的副本中。 如何让它创建一个集合并通过setter进行设置
另外,在我真正的业务对象中,我在getter中从DB实体收集ID,并且不能在getter中返回集合
谢谢
# 1 楼答案
上次编辑-
打印输出:
在解组过程中,JAXB会检查集合是否为空,是否为空(它会第一次调用setter将其初始化为空),您可以在日志中看到这一点
但是,之后,它将使用其内部逻辑来填充集合(集合),通过使用您拥有的Setter初始化其类型(新集合)*,并使用集合。添加(xyz);加上(1),然后加上(5)
调用的JAXB逻辑可以在类中找到:
//StartPack正在调用以初始化集合集,使其为空
//正确的方法是,这会在之后(在任何实体逻辑之前)调用,以执行addToPack(1)、addToPack(5)和<;-现在你的布景有[1,5]
然后,你在日志中看到,它调用getCitiesId(),你会神奇地看到它有[1,5]
这就是JAXB处理集合的方式。所有其他元素,它们的适当设置器被称为
见JAXB does not call Setter method
你需要想出一种不同的方法来做这件事,而不是依赖于getter/setter。它完成了从XML文件中解组对象的工作,其余的逻辑可以用外部方法编写