JAX-WS ile Apache CXF
Bu JAX-WS uygulamasında, önceki POJO uygulaması gibi Apache CXF-ilk yaklaşımını kullanacağız. Bu yüzden önce web servisimiz için bir arayüz oluşturacağız.
Servis Arayüzünü Bildirme
Önceki durumda olduğu gibi, selamlama adı verilen tek bir arayüz yöntemine sahip önemsiz bir hizmet oluşturacağız. Servis arayüzü kodu aşağıda gösterilmiştir -
//HelloWorld.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
String greetings(String text);
}
Arayüzü bir @WebServiceetiket. Daha sonra bu arayüzü uygulayacağız.
Web Arayüzünün Uygulanması
Web arayüzünün uygulaması burada gösterilmektedir -
//HelloWorldImpl.java
package com.tutorialspoint.cxf.jaxws.helloworld;
public class HelloWorldImpl implements HelloWorld {
@Override
public String greetings(String name) {
return ("hi " + name);
}
}
Selamlama yöntemi ile açıklanmıştır @Overrideetiket. Yöntem, arayan kişiye bir "merhaba" mesajı verir.
Ardından, sunucuyu geliştirmek için kod yazacağız.
Geliştirme Sunucusu
POJO uygulamasından farklı olarak, hizmetimizi yayınlamak için CXF tarafından sağlanan Endpoint sınıfını kullanarak arayüzü ayrıştıracağız. Bu, aşağıdaki iki kod satırında yapılır -
HelloWorld implementor = new HelloWorldImpl();
Endpoint.publish(
"http://localhost:9090/HelloServerPort",
implementor,
new LoggingFeature()
);
Yayınlama yönteminin ilk parametresi, hizmetimizin istemcilere sunulacağı URL'yi belirtir. İkinci parametre, hizmetimiz için uygulama sınıfını belirtir. Sunucunun kodunun tamamı aşağıda gösterilmiştir -
//Server.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.xml.ws.Endpoint;
import org.apache.cxf.ext.logging.LoggingFeature;
public class Server {
public static void main(String[] args) throws Exception {
HelloWorld implementor = new HelloWorldImpl();
Endpoint.publish("http://localhost:9090/HelloServerPort",
implementor,
new LoggingFeature());
System.out.println("Server ready...");
Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting ...");
System.exit(0);
}
}
Sunucumuzu dağıtmak için, aşağıda listelendiği gibi projenizde birkaç değişiklik yapmanız gerekecektir.
Sunucuyu Dağıtma
Son olarak, sunucu uygulamasını dağıtmak için, uygulamanızı bir web uygulaması olarak kurmak için pom.xml'de bir değişiklik daha yapmanız gerekecektir. Eklemeniz gereken kodpom.xml aşağıda verilmiştir -
<profiles>
<profile>
<id>server</id>
<build>
<defaultGoal>test</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>
com.tutorialspoint.cxf.jaxws.helloworld.Server
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Uygulamayı dağıtmadan önce, projenize iki dosya daha eklemeniz gerekir. Bunlar aşağıdaki ekran görüntüsünde gösterilmektedir -
Bu dosyalar, eşlemeyi tanımlayan CXF standart dosyalarıdır. CXFServlet. İçindeki kodweb.xml dosya hızlı başvurunuz için burada gösterilmektedir -
//Web.xml
<?xml version = "1.0" encoding = "UTF-8"??>
<web-app xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>cxf</display-name>
<servlet>
<description>Apache CXF Endpoint</description>
<display-name>cxf</display-name>
<servlet-name>cxf</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>
1
</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>
cxf
</servlet-name>
<url-pattern>
/services/*
</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
İçinde cxf-servlet.xml,hizmetinizin uç noktası için özellikleri bildirirsiniz. Bu, aşağıdaki kod pasajında gösterilmektedir -
<beans ...>
<jaxws:endpoint xmlns:helloworld = "http://tutorialspoint.com/"
id = "helloHTTP"
address = "http://localhost:9090/HelloServerPort"
serviceName = "helloworld:HelloServiceService"
endpointName = "helloworld:HelloServicePort">
</jaxws:endpoint>
</beans>
Burada hizmet uç noktanızın kimliğini, hizmetin kullanılabileceği adresi, hizmet adını ve uç nokta adını tanımlarız. Şimdi, hizmetinizin bir CXF sunucu uygulaması tarafından nasıl yönlendirildiğini ve işlendiğini öğrendiniz.
Son pom.xml
pom.xmlbirkaç tane daha bağımlılık içerir. Tüm bağımlılıkları açıklamak yerine, aşağıya pom.xml'nin son sürümünü ekledik -
<?xml version = "1.0" encoding = "UTF-8"??>
<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>com.tutorialspoint</groupId>
<artifactId>cxf-jaxws</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<profiles>
<profile>
<id>server</id>
<build>
<defaultGoal>test</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>
com.tutorialspoint.cxf.jaxws.helloworld.Server
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>client</id>
<build>
<defaultGoal>test</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
<goals>
<configuration>
<mainClass>
com.tutorialspoint.cxf.jaxws.helloworld.Client
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-features-logging</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
</project>
Ayrıca, bu öğreticinin sonraki bölümlerinde öğreneceğimiz müşteri oluşturmak için bir profil içerdiğini unutmayın.
HelloWorld Hizmetini Çalıştırmak
Artık web uygulamasını çalıştırmaya hazırsınız. Komut penceresinde, aşağıdaki komutu kullanarak derleme komut dosyasını çalıştırın.
mvn clean install
mvn -Pserver
Konsolda aşağıdaki mesajı göreceksiniz -
INFO: Setting the server's publish address to be http://localhost:9090/HelloServerPort
Server ready…
Daha önce olduğu gibi, tarayıcınızda sunucu URL'sini açarak sunucuyu test edebilirsiniz.
Herhangi bir işlem belirtmediğimiz için, uygulamamız tarafından tarayıcıya sadece bir hata mesajı dönmektedir.
Şimdi eklemeyi deneyin ?wsdl URL'nize ve aşağıdaki çıktıyı göreceksiniz -
Yani sunucu uygulamamız beklendiği gibi çalışıyor. SOAP İstemcisini aşağıdaki gibi kullanabilirsiniz:Postman hizmetinizi daha ayrıntılı test etmek için daha önce açıklanmıştır.
Bir sonraki bölümde, hizmetimizi kullanan bir müşteriyi nasıl yazacağımızı öğreneceğiz.
Müşteri Geliştirme
İstemciyi bir CXF uygulamasında yazmak, bir sunucu yazmak kadar önemsizdir. İşte müşteri için tam kod -
//Client.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.soap.SOAPBinding;
public final class Client {
private static final QName SERVICE_NAME
= new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/",
"HelloWorld");
private static final QName PORT_NAME
= new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/",
"HelloWorldPort");
private Client() {
}
public static void main(String[] args) throws Exception {
Service service = Service.create(SERVICE_NAME);
System.out.println("service created");
String endpointAddress = "http://localhost:9090/HelloServerPort";
service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
endpointAddress);
HelloWorld hw = service.getPort(HelloWorld.class);
System.out.println(hw.greetings("World"));
}
}
Burada, sağlanan CXF'yi kullanıyoruz Servicebilinen hizmete bağlanacak sınıf. Biz arıyoruzcreate yöntemi Servicesınıf hizmetin bir örneğini almak için. Bilinen bağlantı noktasını arayarakaddPort yöntemi service örnek.
İlk olarak servis arayüzünü arayarak yaptığımız servisi artık tüketmeye hazırız. getPort yöntemi serviceörnek. Sonunda arıyoruzgreetings selam mesajını konsolda yazdırma yöntemi.
Şimdi, Apache CXF-First yaklaşımını kullanarak CXF'nin temellerini öğrendikçe, şimdi bir sonraki bölümde WSDL-First yaklaşımıyla CXF'yi nasıl kullanacağınızı öğreneceksiniz.