31 Ocak 2018 Çarşamba

JAXB @XmlType Anotasyonu

Giriş
Şu satırı dahil ederiz.
import javax.xml.bind.annotation.XmlType;
factoryClass Alanı
JAXB normalde unmarshal işleminde no-arg constructor'ı çağırır. Bu sınıfı unmarshal ederken kullanlacak factory metodunu belirtmek için şöyle yaparız.
@XmlType(factoryClass=FooFactory.class, factoryMethod="createFoo")
public class Foo {
  ...
}
Factory sınıfı şöyledir. Böylece nesneye bazı parametreler verebiliriz.
public class FooFactory {
  public Foo createFoo(){
    return new Foo(...);
  }
}
name Alanı
xsi:type alanına değer atamak için kullanılır.
Örnek
Elimizde şöyle bir kod olsun.
@XmlType(name="some_item")
public class Resource {

}
Şöyle yaparız.
Resource resource = new Resource();
JAXBElement<Object> jaxbElement = new JAXBElement<Object>(QName.valueOf("resource"),
  Object.class, resource);

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(jaxbElement, System.out);
Çıktı olarak şunu alırız.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="some_item"/>
propOrder Alanı
Açıklaması şöyle.
The order in which Java reflection returns the list of fields/properties is not guaranteed. This is why JAXB implementations do not use it to determine element order.
Örnek
Şöyle yaparız. Nesneyi XML olarak yazarken alanların sırasını belirtir.
@XmlType (propOrder={"prop1","prop2",..."propN"})
Nesnenin özelliğine field yani alan olarak erişmek istersek @XmlAccessorType(XmlAccessType.FIELD) yaparız.

Property yani getter/setter olarak erişmek istersek hiçbir şey yazmayız.

Örnek
Şöyle yaparız.
@XmlType(propOrder ={"setting", "subsystems"})
@XmlAccessorType(XmlAccessType.FIELD)
public class ProfileImpl implements Profile
{
  @XmlAttribute
  private String setting;

  @XmlElementWrapper(name = "subsystems")
  @XmlElement(name = "subsystem")
  private List<SubsystemImpl> subsystems;
  ...   

}

Hiç yorum yok:

Yorum Gönder