JAXB , Java XML Binding kısaltılmasıdır.JAXB sayesinde XML ve Java sınıflarımız arasındaki bağlantıyı kolay bir şekilde sağlayabiliyoruz.Elimizde XML halinde bulunan veriyi Java sınıfı haline veya Java sınıfını XML şekline dönüştürebiliriz.Basit bir web servis oluşturalım ve bu web servis üzerinden çektiğimiz XML formatındaki veriyi Java sınıfı şeklinde görüntüleyelim.
1)Maven projesi oluşturalım ve kullanacağımız jar dosyalarımızı pom.xml dosyamız içerisine ekleyelim.Bu projede Jersey kullandığımız için Jersey jar dosyalarımızı pom.xml dosyamız içerisine ekliyoruz.
[code lang=”xml”]
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>0004-com.enesbyc-RESTful-JAXB</groupId>
<artifactId>0004-com.enesbyc-RESTful-JAXB</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!– https://mvnrepository.com/artifact/com.sun.jersey/jersey-server –>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.19</version>
</dependency>
<!– https://mvnrepository.com/artifact/com.sun.jersey/jersey-servlet –>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.19</version>
</dependency>
<!– https://mvnrepository.com/artifact/com.sun.jersey/jersey-client –>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>
</project>
[/code]
2)İkinci adımda web.xml dosyamız içerisine Jersey kullandığımızı belirtmemiz gerekiyor.Web.xml dosyamız içerisini düzenleyelim.
[code lang=”xml”]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>0004-com.enesbyc-RESTful-JAXB</display-name>
<!– Jersey kullanimi icin gerekli –>
<!– Jerseyi hangi paket içerisinde kullanacağımızı belirtiyoruz –>
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<!– Jersey-JSON kullanimi icin gerekli –>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.enesbyc</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
[/code]
3)com.enesbyc.model paketimizi oluşturup içerisine Product isminde bir sınıf oluşturalım.Sınıfın içerisinde kullanacağımız property’lerimizi tanımlayalım.
[code lang=”java”]
package com.enesbyc.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
//XML formati kullancagimizi belirtiyoruz.
//Product isminde bir xml olusturulmus oluyor.
//Bu sinif üzerinden xml islemlerimizi artik yapabiliriz.
@XmlRootElement
//Tiplerin önemini belirtiyoruz.
@XmlAccessorType(XmlAccessType.NONE)
public class Product {
//XML içerisindeki propert olarak düsünebiliriz.
//product içerisinde productName ve productPrice
//alanlarini xml tipinde olusturuyoruz.
@XmlElement
String productName;
@XmlElement
String productPrice;
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductPrice() {
return productPrice;
}
public void setProductPrice(String productPrice) {
this.productPrice = productPrice;
}
@Override
public String toString() {
return "Product [productName=" + productName + ", productPrice=" + productPrice + "]";
}
}
[/code]
4)com.enesbyc.service paketimizi oluşturalım ve içerisine ProductService isimli sınıfımızı oluşturalım.
[code lang=”java”]
package com.enesbyc.service;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.enesbyc.model.Product;
//Url kismina /rest/product geldiginde yapilacaklari belirtiyoruz.
@Path("product")
public class ProductService {
//Url kismina /rest/product/info geldiginde yapilacaklari belirtiyoruz.
//XML tipinde veri dönecegini belirtiyoruz.
@GET
@Path("info")
@Produces(MediaType.APPLICATION_XML)
public Product getProductInfo(){
Product product=new Product();
product.setProductName("Cup");
product.setProductPrice("25");
return product;
}
}
[/code]
5)com.enesbyc.main paketimiz içerisine Main sınıfımızı oluşturalım.Bu Main sınıfımız içerisinde web servisimiz üzerinden gelen XML tipindeki veriyi JAXB yardımı ile Product sınıfımız tipine çeviriyoruz.
[code lang=”java”]
package com.enesbyc.main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import com.enesbyc.model.Product;
public class Main {
public static void main(String[] args) {
try {
URL url = new URL("http://localhost:8080/0004-com.enesbyc-RESTful-JAXB/rest/product/info");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
// Adrese istekte bulundugunda xml alacagini belirtiyor.
conn.setRequestProperty("Accept", "application/xml");
//Okuma islemi yapiliyor.
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
//Okunan veriler sonuc deðiskeni içerisine atiliyor.
//Sonuc içerisinde string halde tutuluyor.
String sonuc = br.readLine();
System.out.println("XML tipindeki sonuc:"+sonuc);
conn.disconnect();
// JAXB Xmldeki bilgileri java tarafinda karsilar.
// Tutulan nesneleri Product tipinde olacagini belirtiyor.
JAXBContext jaxbContext = JAXBContext.newInstance(Product.class);
// XML’deki veriyi parçalar.
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
// XML’deki veriler Product sinifina çevriliyor..
Product product = (Product) unmarshaller.unmarshal(new StringReader(sonuc));
//XML formatindaki veriler product tipinde yazdiriliyor.
System.out.println("Product sinifi tipindeki sonuc:"+product);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
[/code]
6)Projemizi çalıştırırken ilk olarak projemize sağ tıklayıp Run as->Run on the server seçelim.Bu sayede web servisimiz çalışmış oldu.Ardından Main sınıfımıza sağ tıklayıp Run as-> Java Application seçelim.Main sınıfımız URL’den web servisimize bağlanarak bize return edilen XML tipindeki veriyi alarak işlemlerini yapacaktır.Konsol üzerinden kontrol ettiğimizde önce XML formatında ardından Java sınıfı formatında çıktı alacağız.
