บริการเว็บใน Java SE ตอนที่ 2: การสร้างบริการเว็บ SOAP

JAX-WS รองรับบริการเว็บที่ใช้ SOAP ส่วนที่ 2 ของซีรีส์สี่ส่วนนี้บน Java SE Web services กำหนดเว็บเซอร์วิสที่ใช้ SOAP สร้างและตรวจสอบบริการเว็บนี้ในเครื่องผ่านเซิร์ฟเวอร์ HTTP ที่มีน้ำหนักเบาเริ่มต้น (กล่าวถึงในตอนที่ 1) แปลความหมายของเอกสาร WSDL ของบริการ และเข้าถึงบริการจากลูกค้าทั่วไป

การกำหนดบริการเว็บแปลงหน่วย

บริการเว็บการแปลงหน่วยซึ่งฉันตั้งชื่อว่า UC ประกอบด้วยฟังก์ชันสี่อย่างสำหรับการแปลงระหว่างเซนติเมตรและนิ้วและระหว่างองศาฟาเรนไฮต์และองศาเซลเซียส แม้ว่าตัวอย่างนี้อาจถูกสร้างเป็นคลาส Java เดียว แต่ฉันก็เลือกที่จะปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดโดยการสร้างเป็นอินเทอร์เฟซ Java และคลาส Java รายการ 1 แสดงUCอินเทอร์เฟซของบริการเว็บ

รายการ 1. อินเทอร์เฟซปลายทางของบริการเว็บ UC

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); }

UCอธิบายถึงService Endpoint Interface (SEI)ซึ่งเป็นอินเทอร์เฟซ Java ที่แสดงการทำงานของ Web service interface ในแง่ของวิธีการ Java แบบนามธรรม ลูกค้าสื่อสารกับบริการเว็บที่ใช้ SOAP ผ่าน SEI

UCได้รับการประกาศให้เป็น SEI ผ่าน@WebServiceคำอธิบายประกอบ เมื่ออินเทอร์เฟซ Java หรือคลาสถูกใส่คำอธิบายประกอบเมธอด@WebServiceทั้งหมดpublicที่มีพารามิเตอร์ส่งคืนค่าและข้อยกเว้นที่ประกาศจะเป็นไปตามกฎที่กำหนดไว้ในส่วนที่ 5 ของข้อกำหนด JAX-RPC 1.1 จะอธิบายการทำงานของบริการเว็บ เพราะเพียงpublicวิธีการที่สามารถประกาศในอินเตอร์เฟซที่publicคำสงวนไม่จำเป็นเมื่อประกาศc2f(), cm2in(), และf2c() วิธีการเหล่านี้โดยปริยายin2cm()public

@WebMethodแต่ละวิธีก็ยังเป็นข้อเขียน แม้ว่า@WebMethodจะไม่จำเป็นในตัวอย่างนี้ แต่การมีอยู่ช่วยเสริมความจริงที่ว่าวิธีการที่มีคำอธิบายประกอบแสดงให้เห็นการดำเนินการบริการบนเว็บ

รายการ 2 แสดงUCImplคลาสของบริการเว็บ

รายการ 2. Bean Implementation ของบริการเว็บ UC

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; } }

UCImplอธิบายถึงService Implementation Bean (SIB)ซึ่งให้การดำเนินการตาม SEI คลาสนี้ได้รับการประกาศให้เป็น SIB ผ่าน@WebService(endpointInterface = "ca.javajeff.uc.UC")คำอธิบายประกอบ endpointInterfaceองค์ประกอบเชื่อมต่อ SIB นี้เพื่อ SEI และเป็นสิ่งที่จำเป็นเพื่อหลีกเลี่ยงข้อผิดพลาดที่ไม่ได้กำหนดชนิดของพอร์ตเมื่อใช้โปรแกรมไคลเอนต์ที่นำเสนอในภายหลัง

implements UCประโยคไม่ได้เป็นสิ่งจำเป็นอย่างยิ่ง หากไม่มีประโยคนี้UCอินเทอร์เฟซจะถูกละเว้น (และซ้ำซ้อน) อย่างไรก็ตามควรเก็บไว้implements UCเพื่อให้คอมไพเลอร์สามารถตรวจสอบได้ว่ามีการใช้วิธีการของ SEI ใน SIB หรือไม่

ส่วนหัวเมธอดของ SIB ไม่ได้ใส่คำอธิบายประกอบ@WebMethodเนื่องจากโดยทั่วไปแล้วคำอธิบายประกอบนี้จะใช้ในบริบทของ SEI แต่ถ้าคุณมีการเพิ่มpublicวิธีการ (ซึ่งสอดรับกับกฎระเบียบในมาตรา 5 แห่ง JAX-RPC 1.1 สเปค) เพื่อ SIB @WebMethod(exclude = true)และถ้าวิธีนี้ไม่ได้เปิดเผยการดำเนินการบริการเว็บที่คุณจะใส่คำอธิบายประกอบส่วนหัวของวิธีการ โดยการกำหนดtrueที่จะ@WebMethod's excludeองค์ประกอบคุณป้องกันวิธีการที่ถูกที่เกี่ยวข้องกับการดำเนินการ

บริการบนเว็บนี้พร้อมที่จะเผยแพร่เพื่อให้สามารถเข้าถึงได้จากไคลเอนต์ รายการ 3 แสดงUCPublisherแอปพลิเคชันที่ทำงานนี้ให้สำเร็จในบริบทของเซิร์ฟเวอร์ HTTP ที่มีน้ำหนักเบาเริ่มต้น

รายชื่อ 3. การเผยแพร่ UC

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()); } }

การเผยแพร่บริการบนเว็บเกี่ยวข้องกับการโทรไปยังเมธอดคลาสEndPointของEndpoint publish(String address, Object implementor)คลาสaddressพารามิเตอร์ระบุ URI ที่ได้รับมอบหมายให้บริการเว็บ ฉันเลือกที่จะเผยแพร่บริการเว็บนี้บนโลคัลโฮสต์โดยระบุlocalhost(เทียบเท่ากับที่อยู่ IP 127.0.0.1) และหมายเลขพอร์ต9901(ซึ่งเป็นไปได้มากที่สุด) นอกจากนี้ฉันได้เลือก/UCเส้นทางการตีพิมพ์โดยพลการimplementorพารามิเตอร์ระบุเป็นตัวอย่างของUC's SIB

publish()วิธีการสร้างและเผยแพร่ปลายทางสำหรับระบุimplementorวัตถุที่ได้รับaddressและใช้implementor's คำอธิบายประกอบในการสร้างเอกสาร Web Services Definition Language (WSDL) และ XML Schema ทำให้โครงสร้างพื้นฐานของเซิร์ฟเวอร์ที่จำเป็นถูกสร้างและกำหนดค่าโดยการนำ JAX-WS ไปใช้ตามการกำหนดค่าเริ่มต้นบางอย่าง นอกจากนี้วิธีนี้ทำให้แอปพลิเคชันทำงานไปเรื่อย ๆ (ในเครื่อง Windows ให้กดปุ่ม Ctrl และ C พร้อมกันเพื่อยุติแอปพลิเคชัน)

การสร้างและตรวจสอบบริการเว็บ

การสร้างบริการ UC Web ที่กำหนดไว้ก่อนหน้านี้ไม่ใช่เรื่องยาก ขั้นแรกคุณต้องสร้างโครงสร้างไดเร็กทอรีที่เหมาะสมซึ่งมีไฟล์ที่เหมาะสม ทำงานนี้ให้สำเร็จโดยทำตามขั้นตอนต่อไปนี้:

  1. ภายในไดเร็กทอรีปัจจุบันสร้างcaไดเร็กทอรี ภายในcaสร้างjavajeffไดเร็กทอรี สุดท้ายภายในjavajeffสร้างucไดเร็กทอรี
  2. คัดลอกรายการ 1 ไปยังUC.javaไฟล์ต้นฉบับและเก็บไฟล์นี้ในรูปแบบca/javajeff/uc.
  3. คัดลอกรายการ 2 ไปยังUCImpl.javaไฟล์ต้นฉบับและเก็บไฟล์นี้ในรูปแบบca/javajeff/uc.
  4. คัดลอกรายการ 3 ไปยังUCPublisher.javaไฟล์ต้นฉบับและเก็บไฟล์นี้ไว้ในไดเร็กทอรีปัจจุบันซึ่งมีcaไดเร็กทอรี

งานต่อไปคือการรวบรวมไฟล์ต้นฉบับเหล่านี้ สมมติว่าคุณไม่ได้เปลี่ยนไดเร็กทอรีให้รันคำสั่งต่อไปนี้เพื่อคอมไพล์ซอร์สไฟล์เหล่านี้ใน Java SE 9 (ละเว้น--add-modules java.xml.wsใน Java SE 6, 7 หรือ 8):

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

หากไฟล์ต้นฉบับเหล่านี้คอมไพล์สำเร็จให้รันคำสั่งต่อไปนี้เพื่อรันแอพพลิเคชั่นนี้ใน Java 9 (เว้น--add-modules java.xml.wsใน Java SE 6, 7 หรือ 8):

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

ในขณะที่แอปพลิเคชันทำงานให้ใช้เว็บเบราว์เซอร์เพื่อตรวจสอบว่าบริการบนเว็บนี้ทำงานอย่างถูกต้องและเพื่อเข้าถึงเอกสาร WSDL เริ่มเว็บเบราว์เซอร์ที่คุณชื่นชอบและป้อนบรรทัดต่อไปนี้ในแถบที่อยู่:

//localhost:9901/UC

รูปที่ 1 แสดงผลลัพธ์ของเว็บเพจในเว็บเบราว์เซอร์ Google Chrome

รูปที่ 1. หน้าเว็บของ UC ให้ข้อมูลโดยละเอียดเกี่ยวกับบริการเว็บที่เผยแพร่

รูปที่ 1 แสดงชื่อบริการและพอร์ตที่ผ่านการรับรองของ Web service endpoint (สังเกตว่าชื่อแพ็กเกจถูกกลับด้าน - uc.javajeff.caแทนca.javajeff.uc) ลูกค้าใช้ชื่อเหล่านี้เพื่อเข้าถึงบริการ

รูปที่ 1 ยังแสดงที่อยู่ URI ของบริการเว็บตำแหน่งของเอกสาร WSDL ของบริการเว็บ (URI ของบริการเว็บที่ต่อท้ายด้วย?wsdlสตริงการสืบค้น) และชื่อที่ตรงตามแพ็กเกจของคลาสการใช้งานบริการเว็บ

การตีความเอกสาร WSDL ของบริการเว็บ

ตำแหน่งของเอกสาร WSDL ของ UC Web service จะแสดงเป็นลิงค์ คลิกที่ลิงค์นี้เพื่อดูเอกสาร WSDL ซึ่งมีเนื้อหาอยู่ใน Listing 4

รายการ 4. เอกสาร WSDL ของ UC

เอกสาร WSDLเป็นเอกสาร XML ที่มีdefinitionsองค์ประกอบรากซึ่งจะทำให้อะไรเอกสาร WSDL มากกว่าชุดของคำจำกัดความ องค์ประกอบนี้ประกอบด้วยxmlnsแอตทริบิวต์ต่างๆสำหรับการระบุเนมสเปซมาตรฐานต่างๆพร้อมด้วยtargetNameSpaceและnameแอตทริบิวต์:

  • 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: