gpt4 book ai didi

java - 编码时 JAXB 展平实体列表

转载 作者:行者123 更新时间:2023-12-02 09:33:05 25 4
gpt4 key购买 nike

我使用 JPA/Hibernate 作为我的持久性框架,并且我有以下实体层次结构:

@Entity
@Table(name = "node")
@XmlRootElement(name = "nodeMap")
@XmlAccessorType(XmlAccessType.FIELD)
public class NodeMapDTO {

@XmlElementWrapper(name = "ipAddresses")
@XmlElement(name = "ipAddress")
@OneToMany
@JoinColumn(name = "node_id")
private List<IPAddressDTO> ipAddresses;

[...]
}

@Entity
@Table(name = "node_ip_address")
@XmlAccessorType(XmlAccessType.FIELD)
public class IPAddressDTO {

@Column(name = "ip_address")
private String ipAddress;

[...]
}

当我将 NodeMapDTO 转换为 XML 时,我得到以下结果:

<nodeMap>
<ipAddresses>
<ipAddress>
<ipAddress>192.59.233.20</ipAddress>
</ipAddress>
</ipAddresses>
</nodeMap>

但我希望它是:

<nodeMap>
<ipAddresses>
<ipAddress>192.59.233.20</ipAddress>
</ipAddresses>
</nodeMap>

不幸的是,我需要我的 ipAddresses字段是 IPAddressDTO 的列表s 而不是 String因为否则我无法使用 @OneToMany 注释(不,出于性能原因我不想使用 @ElementCollection)。

我还想尝试在不必创建任何额外的包装类的情况下执行此操作。我想如果我为 List<IPAddressDTO> ipAddresses 创建一个包装类字段,我的 Hibernate 注释将不起作用,它只会使代码比需要的更加复杂。

谢谢大家。

最佳答案

使用@XmlValue注释字段ipAddress .

这是完整的 Minimal, Reproducible Example :

import java.util.*;
import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
public class Test {
public static void main(String[] args) throws Exception {
Marshaller marshaller = JAXBContext.newInstance(NodeMapDTO.class).createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(new NodeMapDTO(new IPAddressDTO("192.59.233.20")), System.out);
}
}
@XmlRootElement(name = "nodeMap")
@XmlAccessorType(XmlAccessType.FIELD)
public class NodeMapDTO {
@XmlElementWrapper(name = "ipAddresses")
@XmlElement(name = "ipAddress")
private List<IPAddressDTO> ipAddresses;

NodeMapDTO() {
}
NodeMapDTO(IPAddressDTO... ipAddresses) {
this.ipAddresses = Arrays.asList(ipAddresses);
}
}
@XmlAccessorType(XmlAccessType.FIELD)
public class IPAddressDTO {
@XmlValue
private String ipAddress;

IPAddressDTO() {
}
IPAddressDTO(String ipAddress) {
this.ipAddress = ipAddress;
}
}

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<nodeMap>
<ipAddresses>
<ipAddress>192.59.233.20</ipAddress>
</ipAddresses>
</nodeMap>

关于java - 编码时 JAXB 展平实体列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57781048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com