JAX-WS ve Maven

JAX-WS Javanın, SOAP(Simple Object Access Protocol) web servisleri geliştirmek için kullanılan kütüphanesi daha doğrusu arayüzü. Vakti zamanında Javanın RPC(Remote Procedure Call) kütüphanesinin yerine geçmek için geliştirilmiş. Günümüz web servislerini düşünecek olursak amacınıda başarıyla yerine getirdiğini görebilirsiniz. 

JAX-WS

JAX-WS kütüphanesini ele alırken biraz da WS-I konusundan bahsetmek istiyorum. WS-I (Web Services Interoperability) bir web servis standartı olarak düşünülebilir. Web servislerin temelin, ortam, mimari ya da programlama dili gözetmeksizin iki programı haberleştirmek oluşturmaktadır. Fakat eğer programlama dili, ortam ya da mimari gözetmeyeceksek bu web servislerin ürettiği arayüzlerin aynı ya da benzer olması gerekmektedir. İşte WS-I bu arayüzlerin yani WSDL dosyalarının nasıl olması gerektiğini tanımlamaktadır. Şu anda aktif olarak kullanılan 4 farklı WSDL kodlama çeşidi bulunmaktadır.

Kodlama Çeşitlerine göre;

  1. RPC/encoded
  2. RPC/literal
  3. Document/encoded
  4. Document/literal

Burada sadece 2, 3 ve 4 numaralı kodlama türleri WS-I tarafından desteklenmektedir. Bu sebepten kullanacağınız JAX-WS kütüphanesi de bu üç tip kodlama imkanı sağlamaktadır. 1 numaralı kodlama ise tahmin edebileceğiniz gibi eski Java RPC kütüphanesinin desteklediği kodlama çeşididir. Java’da RPC/encoded türünde kodlama kod üreten sadece Axis kütüphanesi bulunmaktadır. Axis2’de dahil olmak üzere çok kullanılan web servis kütüphaneleri JAX-WS uyumludur.

JAX-WS’in bir diğer güzelliği Java EE standartı olmasıdır. Yani Java EE uyumlu bir uygulama sunucusu (Jboss AS vs.) kullandığınız taktirde ek hiç bir ayar yapmadan, doğrudan ilgili Java jaxws_mavenannotation yapılarını kullanarak web servislerinizi oluşturabilirsiniz. Fakat bir servlet container (Tomcat, Jetty vs.) kullandığınızda bazı ayarlara ve kütüphanelere ihtiyaç duyacaksınız. İşte bu yazıda, Tomcat ve Maven kullanarak bu ayarları nasıl yapacağınıza bakacağız.

Maven

İlk önce, Maven ile, maven-archetype-webapp  archetpye’ını kullanarak projemizi oluşturuyoruz. Benim örneği yaparken kullandığım diğer bilgiler aşağıdaki gibidir.

  • Group Id: com.bahadirakin
  • Artifact Id: jaxws-maven

Maven sizin için Eclipse altında Dinamik web projesi yaratacaktır. Yaratılan bu web projesi 2.3 versiyonunu kullanıyor. Fakat ben ayarlarımı kolaylaştırması için Servlet 3.0 kullanacağım. Bu ayarı projenizin özellikleri alanından Project Facets bölümündne değiştirebilirsiniz.

JAX-WS daha önce bahsettiğim gibi sadece bir arayüz yani bir API. Bu API’ın farklı uygulamaları mevcut. Apache Axis2, Apache CXF içlerinde hem kendi uygulamalarını hem JAX-WS uygulamalarını barındırıyor. Fakat ben işleri basite indirgemek adına Metro uygulamasını kullanacağım. Metro’yu kullanmamın sebebi, sadece JAX-WS uygulaması olması. Metro kütüphanesini kullanmak için aşağıdaki bağımlılıkları ekliyoruz.

<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/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.bahadirakin</groupId>
<artifactId>jaxws-maven</artifactId>
<packaging>war</packaging>

<version>0.0.1-SNAPSHOT</version>
<name>jaxws-maven Maven Webapp</name>
<url>http://maven.apache.org</url>

<dependencies>
<dependency>
<groupId>org.glassfish.metro</groupId>
<artifactId>webservices-rt</artifactId>
<version>2.2.1-1</version>
</dependency>
</dependencies>

<build>
<finalName>jaxws-maven</finalName>
</build>
</project>

Web Servis

Ayarlara geçmeden önce en basit haliyle JAX-WS web servisimizi yazalım. Tabi adet olduğu üzere bir HelloWorld sınıfı yazacağız. Bunun için öncelike src/main/java kaynak klasörümüze, com.bahadirakin.jaxws isimli bir paket oluşturuyoruz. Ardından bu paketin içerisinde HelloWorld.java isimli sınıfımızı oluşturuyoruz. Bu sınıfın içeriği ise aşağıdaki gibidir.

package com.bahadirakin.jaxws;
import javax.jws.WebService;
@WebService
public class HelloWorld {
public String hello(String param) {
 return "Hello, " + param;
 }
}

Şimdi ise son olarak ayarlarımızı yapmamız gerekiyor. Eğer Servlet 3.0 kullanmıyorsanız web.xml dosyasına aşağıdaki servlet’leri tanıtmanız gerekmektedir.


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 id="WebApp_ID" version="2.5">
 <display-name>JAXWS Maven</display-name>
 <welcome-file-list>
 <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
 <listener>
 <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
 </listener>
 <servlet>
 <servlet-name>jaxws-servlet</servlet-name>
 <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
 <servlet-name>jaxws-servlet</servlet-name>
 <url-pattern>/HelloWorldService</url-pattern>
 </servlet-mapping>
</web-app>

Son olarak web servis tanımlarının yapıldığı sun-jaxws.xml dosyasını WEB-INF klasörünün altına ekliyoruz.


<?xml version="1.0" encoding="UTF-8"?>

<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
 version="2.0">
 <endpoint name="HelloWorldService" implementation="com.bahadirakin.jaxws.HelloWorld"
 url-pattern="/HelloWorldService" />
</endpoints>

Burdan sonra tek yapmanız gereken projenizi Tomcat üzerinde ayağa kaldırmak. Eğer Jboss AS gibi bir uygulama sunucu kullanıyor olsaydık ne maven bağımlılıklarını eklememize, ne sın-jaxws dosyasına ne de web.xml üzerinde yaptığımız ayarlara gerek olacaktır. Tomcat üzerinde uygulamamızı ayağa kaldırdıktan sonra http://localhost:8080/jaxws-maven/HelloWorldService adresinden servis bilgilerinize erişebiliyor olmanız gerekmektedir.

Referanslar

Ek bilgilere aşağıdaki referanslardan ulaşabilirsiniz.

End of Line