27 Şubat 2015 Cuma

JAXB

JAXB
JAXB JSR 222 ile tanımlı.
Java Architecture for XML Binding (JAXB), which is also known as JSR-222, is a Java technology that provides an easy and convenient way to map Java classes and XML schema for simplified development of Web services.

Bir sınıfa @WebMethod anotasyonu eklenince o sınıf, JAXB context'ine ekleniyor.


JAXB ve Default Constructor
JAXB serialize edilecek sınıfın default constructor'a sahip olması gerekiyor. Mesela Throwable sınıfı default constructor'a sahip olmadığı için XML'e çevrilemez.

JAXB ile XSD Dosyasından Kod Üretme
1. jaxb-xjc.jar dosyası JDK ile gelir (JVM ile değil!). Aşağıdaki komut çalıştırılabilir.
java -jar jaxb-xjc.jar -d src -p jaxb.mypackage -extension xsd\myschema.xsd
-d ile kodun üretileceği dizin belirtilir.
-p ile üretilecek kodun hangi paket içinde olacağı belirtilir.

2. Ya da
jc -p [path] [xsd file] ile de kod üretilebilir.

Kaynak Koddan XSD Üretme
Eclipse ile yaratılan bir JAXB projesinden kaynak koda sağ tıklanıp New -> Other...->JAXB->Schema from JAXB Classes seçeneği kullanılırsa, JAXB anotasyonları kullanılmış kod için XSD üretilir.

Anotasyonlar
Tüm anotasyonlar javax.xml.bind.annotation namespace içinde

XmlRootElement (Sınıf için)
XmlRootElement anatasyonu ile sınıfın XML ve JSON'a otomatik dönüşüm sağlanıyor.
@XmlRootElement(name="pokemon")
public class Pokemon {

    @XmlElement(required=true)
    private String id;
}

name Açıklaması
Sınıfın XML'e dönüştürülürken kullanılacak XML tag'inin ismini belirler. Sınıfın ismi Pokemon olmasına rağmen xml'de küçük farf ile başlar.
<pokemon>
    <id>Charizard</id>
    <!-- Other elements -->
</pokemon>

XmlSeeAlso
Tam ne olduğunu anlamasam da bu anotasyon ile bir sınıf JAXB'ye tanıtılıyor.

XmlElement (Field için)
XmlElement anotasyonu ile bir element'in XML'e nasıl çevirileceği belirtiliyor.

required Açıklaması
Normalde required false değerine sahiptir. Bu durumda xsd dosyası minOccurs=0 olarak  üretilir. Örnek:
<xs:element name="return" type="tns:ucret" minOccurs="0"/>
Eğer required true değerine sahipse xsd dosyası  minOccurs=1 olarak üretilir.

nillable Açıklaması
Buradaki örnekte null olan bir element normalde XML'e çevirilmezken, required=true ve nillable=true kullanılarak çevirilmesi sağlanmış.
Bu durumda xsd dosyası aşağıdaki gibi üretilir.

Buradaki örnekte ise  XmlElement anotasyonuna name bilgisi atanarak üretilen XML'in tagleri değiştiriliyor.
XMLElement anotasyonu JAXB içinde JAXBElement sınıfı ile temsil ediliyor. Eğer göndermek istediğimiz cevap Object gibi generic bir şeyse JAXB her türlü nesneyi XML'e nasıl çeviriceğini bilemeyebilir. Bu gibi durumlarda bazen aşağıdaki gibi bir kod kullanılabilir.

XmlJavaTypeAdapter
Bu anotasyon ile JAXB kurallarına uymayan bir sınıfı (örneğin sınıfın default constructor'ı olmayabilir), uygun hale getirmek mümkün. Örnek.

JAXBContext ile XML Okuma
Önce bir unmarshaller yaratılır.
JAXBContext jaxbContext = JAXBContext.newInstance();
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Daha sonra input stream okunur. Aşağıdaki kodda sınıfımın M olduğunu varsayalım.
JAXBElement<M> element = (JAXBElement<M>) unmarshaller.unmarshal(stream);
Daha sonra element.getValue() ile sınıfımız elde edilir.

JAXBContext ile XML Yazma
Bu sınıf ile Customer isimli bir nesneyi XML'e çevirme örneği
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
JAXBElement<Customer> jaxbElement = new JAXBElement<Customer>(new QName("customer"), Customer.class, CUSTOMER);
marshaller.marshal(jaxbElement, System.out);

Hiç yorum yok:

Yorum Gönder