Java 仅使用JAXB编组选定字段
我正在使用JAXB将java对象编组为XML。我面临的问题是,并非java对象实例的所有成员变量都需要编组为XML。例如,我的完整XML文档应该如下所示-Java 仅使用JAXB编组选定字段,java,xml,jaxb,marshalling,Java,Xml,Jaxb,Marshalling,我正在使用JAXB将java对象编组为XML。我面临的问题是,并非java对象实例的所有成员变量都需要编组为XML。例如,我的完整XML文档应该如下所示- <Disk> <status>attached</status> <size>10000000000</size> <freeSpace>25600000<freeSpace> <id>MI45563PO</id> &l
<Disk>
<status>attached</status>
<size>10000000000</size>
<freeSpace>25600000<freeSpace>
<id>MI45563PO</id>
</Disk>
<Disk>
<freeSpace>20000000<freeSpace>
</Disk>
附属的
10000000000
25600000
MI45563PO
但在更新的情况下,只有选定的属性会更改,并且只有更改的属性才应该是封送XML的一部分。像“status”属性可以更改为“detached”,在这种情况下,封送的XML应该如下所示-
<Disk>
<status>detached</status>
</Disk>
独立的
或者,在“自由空间”的情况下,XML应该是-
<Disk>
<status>attached</status>
<size>10000000000</size>
<freeSpace>25600000<freeSpace>
<id>MI45563PO</id>
</Disk>
<Disk>
<freeSpace>20000000<freeSpace>
</Disk>
20000000
我的问题:将未更改的字段定义为null(从而将所有基本类型定义为包装类变量,如Integer、Boolean等)是获得所需结果的唯一解决方案吗?或者,在JAXB中是否有任何方法可以指定所选字段,这些字段应以结果XML进行封送,其余字段应忽略
请注意,需要忽略和包含的字段集在任何时间点都是不固定的。如果您想拥有一个类的几个视图,应该为每个视图创建类。 示例源代码:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlRootElement;
public class Program {
public static void main(String[] args) throws Exception {
JAXBContext context = JAXBContext.newInstance(Disk.class,
OnlyDiskStatusDecorator.class, OnlyDiskFreeSpaceDecorator.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
Disk disk = new Disk();
disk.setStatus("attached");
disk.setSize(10000000000L);
disk.setFreeSpace(25600000L);
disk.setId("MI45563PO");
m.marshal(disk, System.out);
m.marshal(new OnlyDiskStatusDecorator(disk), System.out);
m.marshal(new OnlyDiskFreeSpaceDecorator(disk), System.out);
}
}
@XmlRootElement
class Disk {
private String status;
private long size;
private long freeSpace;
private String id;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public long getFreeSpace() {
return freeSpace;
}
public void setFreeSpace(long freeSpace) {
this.freeSpace = freeSpace;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "Disk [status=" + status + ", size=" + size + ", freeSpace="
+ freeSpace + ", id=" + id + "]";
}
}
@XmlRootElement(name = "Disk")
class OnlyDiskStatusDecorator {
private Disk disk;
public OnlyDiskStatusDecorator() {
}
public OnlyDiskStatusDecorator(Disk disk) {
this.disk = disk;
}
public String getStatus() {
return disk.getStatus();
}
public void setStatus(String status) {
}
}
@XmlRootElement(name = "Disk")
class OnlyDiskFreeSpaceDecorator {
private Disk disk;
public OnlyDiskFreeSpaceDecorator() {
}
public OnlyDiskFreeSpaceDecorator(Disk disk) {
this.disk = disk;
}
public long getFreeSpace() {
return disk.getFreeSpace();
}
public void setFreeSpace(long freeSpace) {
}
}
上面的示例打印:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<disk>
<freeSpace>25600000</freeSpace>
<id>MI45563PO</id>
<size>10000000000</size>
<status>attached</status>
</disk>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Disk>
<status>attached</status>
</Disk>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Disk>
<freeSpace>25600000</freeSpace>
</Disk>
25600000
MI45563PO
10000000000
附属的
附属的
25600000
我已经为类的两个视图创建了两个装饰器。第一个修饰符用于状态更新,第二个修饰符用于更新自由空间值。您也可以为特定的序列化创建的实现,但我认为这有点复杂。您是否考虑过在XML上使用,然后再使用JAXB 我也处于类似的情况,我有大约3000个JAXB DTO!我把它们减少到一个可控的数字,28
查看w3schools的。我认为,当需要编组的字段集已知时,这可能是一种解决方案。当字段数量很大(10-15个或更多)时,为所有可能的组合创建一个decorator类是不切实际的。谢谢你写下代码的努力。