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;
- RPC/encoded
- RPC/literal
- Document/encoded
- 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 annotation 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.
- JAX-WS Encodings:Â http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/
- Metro:Â http://jax-ws.java.net/
- WS-I:Â http://en.wikipedia.org/wiki/WS-I_Basic_Profile
- JAX-WS Annotasyonları: http://publib.boulder.ibm.com/infocenter/radhelp/v7r0m0/index.jsp?topic=/com.ibm.ws.jaxws.emitter.doc/topics/rwsandoc002.html
End of Line