Java SOAP (JAX-WS)

Paylaş

Java ile SOAP tabanlı web servis oluşturma, oluşturulan SOAP tabanlı web servisini kullanımı ve TC kimlik doğrulama SOAP web servisinin kullanımı yer alıyor.

SOAP Nedir?

SOAP hakkında detaylı bilgi almak için SOAP Nedir? yazıma bakmalısın.

JAX-WS Nedir?

Java programlama dili ile SOAP tabanlı web servis oluşturmak için kullanılan JCP tarafından belirnen JSR 224 şartnamesidir.

SOAP sunucusu oluşturma

Java ile SOAP tabanlı web servis oluşturmak için JDK 8 içerisinde yer alan javax.jws ve javax.xml paketinde yer alan sınıf ve metotlar kullanılabilir.

Java SOAP desteği JDK 9 ile birlikte deprecated olmuş JDK 11 ile programlama dilinden çıkarılmıştır.

SOAP tabanlı web servislerin kullanımı REST tabanlı web servislerine göre kullanım zorluğu, sadece XML desteklemesi ve fazla veri kullanımından dolayı azalmıştır.

Bundan dolayı bir çok programlama dili SOAP desteğini çekmiştir.

Java ile SOAP tabanlı web sunucusu ve istemcisi oluşturmak için Apache CXF, jaxws-rt kütüphanesi kullanılabilir.

Maven projesi oluşturalım.

mvn archetype:generate 
-DgroupId=com.yusufsezer 
-DartifactId=server 
-DarchetypeArtifactId=maven-archetype-quickstart 
-DinteractiveMode=false

Java JDK sürümüne göre pom.xml dosyasını düzenleyelim.

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
</properties>

Gerekli kütüphaneyi pom.xml dosyasına ekleyelim.

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>4.0.2</version>
</dependency>

NOT: Kütüphanenin 2.3.3 sürümünden sonra paket isimlendirmeleri javax yerine jakarta olmuştur.

SOAP web sunucu oluşturmak sıradan Java sınıfları ve Java Annotations kullanmaktan ibarettir.

@WebService
public class MyService {

    @WebMethod
    public String getAdiSoyadi() {
        return "Yusuf Sezer";
    }

    @WebMethod
    public int topla(int sayi1, int sayi2) {
        return sayi1 + sayi2;
    }

}

@WebService ile sınıfın bir SOAP web servisi olduğunu belirtik.

@WebMethod ile sınıf içindeki metotların Web Servis işlemi(operation) olduğunu belirttik.

Oluşturduğumuz sınıfı kullanmak için Endpoint sınıfının publish metodu kullanılabilir.

public class App {

    public static void main(String[] args) {
        Endpoint.publish("http://localhost:8888/server", new MyService());
        System.out.println("SOAP web servis başlatıldı.");
    }
}

Kodları derleyelim.

mvn package

Derlenen kodları çalıştıralım.

mvn exec:java -D exec.mainClass=com.yusufsezer.App

Web tarayıcı ile aşağıdaki adrese erişerek oluşturulan SOAP web servisine ve WSDL dosyasına ulaşabilirsiniz.

http://localhost:8888/server

Java ile SOAP tabanlı web servis oluşturmanın diğer yöntemi GlassFish, Tomcat EE, Weblogic gibi Application Server veya Apache Tomcat, Jetty, Undertow gibi Servlet Container kullanmaktır.

Application Server içerisinde SOAP web servisi paketi ile birlikte geldiğinden doğrudan çalıştırılacaktır.

Servlet Container içerisinde SOAP web servisi paketi olmadığından ilk olarak gerekli kütüphanelerin projeye eklenmesi ve ayaların yapılması gerekir.

Maven tabanlı web projesi oluşturalım.

mvn archetype:generate 
-DgroupId=com.yusufsezer 
-DartifactId=web-server 
-DarchetypeArtifactId=maven-archetype-webapp 
-DinteractiveMode=false

Gerekli kütüphaneyi pom.xml dosyasına ekleyelim.

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>4.0.2</version>
</dependency>

Java JDK sürümüne göre pom.xml dosyasını düzenleyelim.

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
</properties>

Java SOAP web servisi sınıfını oluşturalım.

@WebService
public class MyService {

    @WebMethod
    public String getAdiSoyadi() {
        return "Yusuf Sezer";
    }

    @WebMethod
    public int topla(int sayi1, int sayi2) {
        return sayi1 + sayi2;
    }

}

Oluşturulan SOAP servis Servlet Container ile çalıştırıldığında çalışmayacaktır.

SOAP servisin çalışması için aşağıdaki ayarların web.xml dosyasına yazılması gerekir.

<listener>
    <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
    <servlet-name>MyServiceService</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>MyServiceService</servlet-name>
    <url-pattern>/MyServiceService</url-pattern>
</servlet-mapping>

Ayrıca WEB-INF dizinine sun-jaxws.xml dosyası oluşturarak aşağıdaki gibi SOAP adresi tanımlanmalıdır.

<?xml version="1.0" encoding="UTF-8"?>
<endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
  <endpoint implementation="com.yusufsezer.MyService" name="MyServiceService" url-pattern="/MyServiceService"/>
</endpoints>

NOT: SOAP web servis JDK sürümü ile Servlet Container sürümü uyumuna dikkat edilmelidir.

SOAP istemci oluşturma

SOAP tabanlı web servislerin en önemli özelliği WSDL olarak adlandırılan servis kullanım dosyası oluşturmasıdır.

WSDL hakkında detaylı bilgi için WSDL Nedir? yazıma bakmalısın.

Herhangi bir programlama dili ile SOAP web servisi kullanımı için WSDL dosyasında yer alan tanımların kullanılacak programlama dili ile kodlanması gerekir.

Bu işlem oldukça zaman alacaktır. Kodları yazmak yerine çeşitli araçların kullanımı faydalı olacaktır.

Java WSDL dosyasından SOAP web servisi kullanımı için otomatik kod üreten wsimport adında bir araca sahiptir.

wsimport [wsdl-adresi]

Oluşturduğumuz SOAP web servisini kullanmak için aşağıdaki gibi kullanabiliriz.

wsimport http://localhost:8888/server?wsdl

Araç sadece kod üretmeyecek ayrıca derleyecektir.

Java kodlarını üretmek için -keep parametresi üretilen kodun dizinin belirtmek için -s parametresi kullanılabilir.

wsimport -keep -s src http://localhost:8888/server?wsdl

NOT: Aracın kullanımı için Java dizininin ortam değişkenlerine eklenmiş olması gerekir.

Java ile gelen SOAP desteği JDK 8 sonrası kaldırıldığından bu aracında desteği kaldırılmıştır.

Bu araç yerine jaxws-maven-plugin eklentisi kullanılabilir.

İlk olarak maven projesi oluşturalım.

mvn archetype:generate 
-DgroupId=com.yusufsezer 
-DartifactId=client 
-DarchetypeArtifactId=maven-archetype-quickstart 
-DinteractiveMode=false

Java JDK sürümüne göre pom.xml dosyasını düzenleyelim.

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
</properties>

Gerekli kütüphaneyi pom.xml dosyasına ekleyelim.

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>4.0.2</version>
</dependency>

Eklentiye ait ayarları yapalım.

<build>
    <plugins>
        <plugin>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>4.0.2</version>
            <configuration>
                <wsdlUrls>
                    http://localhost:8888/server?wsdl
                </wsdlUrls>
                <sourceDestDir>src/main/java</sourceDestDir>
            </configuration>
        </plugin>
    </plugins>
</build>

NOT: Eklentinin 2.3.3 sürümünden sonra paket isimlendirmeleri javax yerine jakarta olmuştur.

NOT2: Kullanılan maven eklentisi ile kullanılan jax-ws eklentisi uyumuna dikkat edilmelidir.

WSDL kodlarını üretelim.

mvn jaxws:wsimport

Eklenti sourceDestDir ile belirtilen dizine SOAP web servisi kullanımı için kodları üretecektir.

Oluşturulan kodların kullanımı aşağıdaki gibidir.

package com.yusufsezer;

public class App {

    public static void main(String[] args) {
        MyServiceService service = new MyServiceService();
        MyService myService = service.getMyServicePort();
        System.out.println(myService.getAdiSoyadi());
    }
}

Kodları derleyelim.

mvn package

Derlenen kodları çalıştıralım.

mvn exec:java -D exec.mainClass=com.yusufsezer.App

SOAP web servisi kullanımı gerekli kodların üretilmesinden sonra sıradan Java sınıfları kullanımı gibidir.

Java ile TC kimlik no sorgulama SOAP web servisini kullanalım.

<build>
    <plugins>
        <plugin>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>4.0.2</version>
            <configuration>
                <wsdlUrls>
                    https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?WSDL
                </wsdlUrls>
                <sourceDestDir>src/main/java</sourceDestDir>
            </configuration>
        </plugin>
    </plugins>
</build>

SOAP web servisi kodlarını maven eklentisi ile üretelim.

mvn jaxws:wsimport

Maven eklentisi ile üretilen SOAP web servisi kodlarını kullanalım.

package com.yusufsezer;

import tr.gov.nvi.tckimlik.ws.KPSPublic;
import tr.gov.nvi.tckimlik.ws.KPSPublicSoap;

public class App {

    public static void main(String[] args) {
        KPSPublic service = new KPSPublic();
        KPSPublicSoap kimlikService = service.getKPSPublicSoap();
        boolean sonuc = kimlikService.tcKimlikNoDogrula(111111111111L, "YUSUF", "SEZER", 1111);
        System.out.println(sonuc ? "Başarılı" : "Hatalı");
    }
}

Kodları derleyelim.

mvn package

Derlenen kodları çalıştıralım.

mvn exec:java -D exec.mainClass=com.yusufsezer.App

SOAP tabanlı web servislerin oluşturulması ve kullanımı REST tabanlı web servislerine göre karmaşık olduğundan sadece önceden oluşturulan SOAP web servislerini kullanmak faydalı olacaktır.

SOAP örneğine buradan ulaşabilirsiniz.

Java Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.


Bunlarda ilgini çekebilir