Java SE'de web hizmetleri, Bölüm 2: SOAP web hizmetleri oluşturma

JAX-WS, SOAP tabanlı Web hizmetlerini destekler. Java SE Web hizmetleri hakkındaki bu dört bölümlük dizinin 2. Bölümü, SOAP tabanlı birim dönüştürme Web hizmetini tanımlar, bu Web hizmetini varsayılan hafif HTTP sunucusu (Bölüm 1'de tartışılmıştır) aracılığıyla yerel olarak oluşturur ve doğrular, hizmetin WSDL belgesini yorumlar ve hizmete basit bir istemciden erişir.

Birim dönüştürme web hizmetini tanımlama

UC adını verdiğim birim dönüştürme Web hizmeti, santimetre ve inç arasında ve Fahrenheit ve Santigrat derece arasında dönüştürme yapmak için dört işlevden oluşur. Bu örnek tek bir Java sınıfı olarak tasarlanabilse de, en iyi uygulamaları bir Java arayüzü ve bir Java sınıfı olarak tasarlayarak izlemeyi seçtim. Liste 1, Web hizmetinin UCarayüzünü sunar.

Liste 1. UC Web hizmetinin Hizmet Uç Noktası Arayüzü

package ca.javajeff.uc; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface UC { @WebMethod double c2f(double degrees); @WebMethod double cm2in(double cm); @WebMethod double f2c(double degrees); @WebMethod double in2cm(double in); }

UCBir açıklanır Servis Endpoint Arabirimi (SEI) soyut Java yöntemleri açısından bir Web hizmeti arabirimin operasyonlarını açığa bir Java arayüzü. Müşteriler, SEI'leri aracılığıyla SOAP tabanlı Web hizmetleriyle iletişim kurar.

UC@WebServicenot ile bir SEI olarak ilan edilir . Bir Java arayüzü veya sınıfı açıklandığında, parametreleri, dönüş değerleri ve bildirilen istisnaları JAX-RPC 1.1 spesifikasyonunun 5. Bölümünde tanımlanan kurallara uyan @WebServicetüm publicyöntemler Web hizmeti işlemlerini açıklar. Yalnızca Çünkü publicyöntemler arayüzlerinde bildirilebilir, publicbildirirken ayrılmış bir sözcük gerekli değildir c2f(), cm2in(), f2c(), ve in2cm(). Bu yöntemler örtülüdür public.

Her yönteme de açıklama eklenmiştir @WebMethod. @WebMethodBu örnekte gerekli olmasa da, varlığı, açıklamalı yöntemin bir Web hizmeti işlemini ortaya çıkardığı gerçeğini güçlendirir.

Liste 2, Web hizmetinin UCImplsınıfını sunar.

Liste 2. UC Web hizmetinin Service Implementation Bean

package ca.javajeff.uc; import javax.jws.WebService; @WebService(endpointInterface = "ca.javajeff.uc.UC") public class UCImpl implements UC { @Override public double c2f(double degrees) { return degrees * 9.0 / 5.0 + 32; } @Override public double cm2in(double cm) { return cm / 2.54; } @Override public double f2c(double degrees) { return (degrees - 32) * 5.0 / 9.0; } @Override public double in2cm(double in) { return in * 2.54; } }

UCImplSEI'nin bir uygulamasını sağlayan bir Service Implementation Bean (SIB) açıklamaktadır . Bu sınıf, @WebService(endpointInterface = "ca.javajeff.uc.UC")açıklama aracılığıyla bir SIB olarak ilan edilir . endpointInterfaceEleman onun SEI bu SIB bağlanır ve daha sonra sunulan istemci uygulaması çalıştırırken tanımsız port tipi hatalarını önlemek için gereklidir.

implements UCFıkra mutlaka gerekli değildir. Bu madde yoksa, UCarabirim yok sayılır (ve gereksizdir). Ancak, implements UCderleyicinin SEI yöntemlerinin SIB'de uygulandığını doğrulayabilmesi için saklamak iyi bir fikirdir .

SIB'nin yöntem başlıklarına açıklama eklenmez @WebMethodçünkü bu açıklama tipik olarak SEI bağlamında kullanılır. Ancak, SIB'ye bir publicyöntem (JAX-RPC 1.1 belirtiminin 5. Bölümündeki kurallara uyan) eklemeniz durumunda ve bu yöntem bir Web hizmeti işlemini göstermiyorsa, yöntem başlığına açıklama eklemeniz gerekir @WebMethod(exclude = true). Atayarak trueiçin @WebMethodbireyin excludeelemanı, bir işlem ile ilişkilidir gelen yöntem engeller.

Bu Web hizmeti, istemcilerden erişilebilmesi için yayınlanmaya hazırdır. Liste 3 UCPublisher, varsayılan hafif HTTP sunucusu bağlamında bu görevi gerçekleştiren bir uygulama sunar .

Liste 3. UC Yayınlama

import javax.xml.ws.Endpoint; import ca.javajeff.uc.UCImpl; public class UCPublisher { public static void main(String[] args) { Endpoint.publish("//localhost:9901/UC", new UCImpl()); } }

Web hizmetini yayınlamak, EndPointsınıfın Endpoint publish(String address, Object implementor)sınıf yöntemine tek bir çağrı yapılmasını içerir . addressParametre tanımlar URI Web hizmetine atadı. Bu Web hizmetini yerel ana bilgisayarda localhost(127.0.0.1 IP adresine eşdeğer) ve bağlantı noktası numarasını 9901(büyük olasılıkla mevcut olan ) belirterek yayınlamayı seçtim . Ayrıca, /UCyayın yolu olarak keyfi olarak seçtim . implementorParametre tanımlar bir örneği UCbireyin SIB.

publish()Yöntem oluşturur ve belirtilen bir bitiş noktası yayımlar implementorverilen nesnenin addressve kullanır implementorWeb Hizmetleri Tanımlama Dili (WSDL) ve XML şema belgeler oluşturmak için 'ın açıklamaları. Bazı varsayılan yapılandırmalara göre gerekli sunucu altyapısının JAX-WS uygulaması tarafından oluşturulmasına ve yapılandırılmasına neden olur. Ayrıca bu yöntem, uygulamanın süresiz olarak çalışmasına neden olur. (Windows makinelerde, uygulamayı sonlandırmak için Ctrl ve C tuşlarına aynı anda basın.)

Web hizmetini oluşturma ve doğrulama

Önceden tanımlanmış UC Web hizmetini oluşturmak zor değil. Öncelikle, uygun dosyaları içeren uygun bir dizin yapısı oluşturmanız gerekir. Aşağıdaki adımları uygulayarak bu görevi tamamlayın:

  1. Geçerli dizinin içinde bir cadizin oluşturun. İçinde cabir javajeffdizin oluşturun . Son olarak, içinde javajeffbir ucdizin oluşturun.
  2. Liste 1'i bir UC.javakaynak dosyaya kopyalayın ve bu dosyayı içinde saklayın ca/javajeff/uc.
  3. Liste 2'yi bir UCImpl.javakaynak dosyaya kopyalayın ve bu dosyayı ca/javajeff/uc.
  4. Liste 3'ü bir UCPublisher.javakaynak dosyaya kopyalayın ve bu dosyayı, dizini içeren geçerli dizinde saklayın ca.

Bir sonraki görev, bu kaynak dosyaları derlemektir. Dizinleri değiştirmediğinizi varsayarak, bu kaynak dosyalarını Java SE 9'da derlemek için aşağıdaki komutu yürütün ( --add-modules java.xml.wsJava SE 6, 7 veya 8'de atlayın ):

javac --add-modules java.xml.ws UCPublisher.java

Bu kaynak dosyalar başarıyla derlenirse, bu uygulamayı Java 9'da çalıştırmak için aşağıdaki komutu çalıştırın ( --add-modules java.xml.wsJava SE 6, 7 veya 8'de atlayın ):

java --add-modules java.xml.ws UCPublisher

Uygulama çalışırken, bu Web hizmetinin doğru çalıştığını doğrulamak ve WSDL belgesine erişmek için bir Web tarayıcısı kullanın. Favori Web tarayıcınızı başlatın ve adres çubuğuna aşağıdaki satırı girin:

//localhost:9901/UC

Şekil 1, Google Chrome Web tarayıcısında ortaya çıkan Web sayfasını göstermektedir.

Şekil 1. UC'nin Web sayfası, yayınlanan Web hizmeti hakkında ayrıntılı bilgi sağlar

Şekil 1, Web hizmeti uç noktasının nitelikli hizmet ve bağlantı noktası adlarını göstermektedir. ( uc.javajeff.caBunun yerine paket adının ters çevrildiğine dikkat edin ca.javajeff.uc). Bir müşteri, hizmete erişmek için bu adları kullanır.

Şekil 1 ayrıca Web hizmetinin adres URI'sini, Web hizmetinin WSDL belgesinin konumunu ( ?wsdlsorgu dizesiyle son eklenmiş Web hizmeti URI'sı ) ve Web hizmeti uygulama sınıfının paket nitelikli adını gösterir.

Web hizmetinin WSDL belgesini yorumlama

UC Web hizmetinin WSDL belgesinin konumu bir bağlantı olarak sunulur. İçeriği Liste 4'te sunulan WSDL belgesini görüntülemek için bu bağlantıya tıklayın.

Liste 4. UC'nin WSDL belgesi

Bir WSDL dokümanı bir bir XML belgesidir definitionstanımların bir dizi daha WSDL belge hiçbir şey yapar kök elemanı. Bu öğe, çeşitli xmlnsstandart ad alanlarını tanımlamak için çeşitli öznitelikler targetNameSpaceve nameöznitelikler içerir:

  • The targetNamespace attribute creates a namespace for all user-defined elements in the WSDL document (such as the c2f element defined via the message element with this name). This namespace is used to distinguish between the user-defined elements of the current WSDL document and user-defined elements of imported WSDL documents, which are identified via WSDL's import element. In a similar fashion, the targetNamespace attribute that appears on an XML Schema-based file's schema element creates a namespace for its user-defined simple type elements, attribute elements, and complex type elements.
  • The name attribute identifies the Web service and is used only to document the service.

Nested within definitions are types, message, portType, binding, and service elements: