1つのクラスのビューをいくつか作成する場合は、ビューごとにデコレータクラスを作成する必要があります。ソースコードの例:
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>
クラスの2つのビューに対して2つのデコレータを作成しました。ステータス更新用の最初のデコレータとfreeSpace値の更新用の2番目のデコレータ。特定のシリアル化のためにXmlAdapterの実装を作成することもできますが、もう少し複雑だと思います。