הפעלת שירות אינטרנט SOAP בג'אווה

1. סקירה כללית

במדריך זה, נלמד כיצד לבנות לקוח SOAP בג'אווה עם JAX-WS RI. ראשית, ניצור את קוד הלקוח באמצעות ה- wsimport השירות ולאחר מכן בדוק אותו באמצעות JUnit.

למתחילים, ההקדמה שלנו ל- JAX-WS מספקת רקע נהדר לנושא.

2. שירות האינטרנט

לפני שנתחיל לבנות לקוח, אנו זקוקים לשרת. במקרה זה, שרת שחושף שירות אינטרנט של JAX-WS.

לצורך הדרכה זו נשתמש בשירות אינטרנט אשר יביא לנו נתונים של מדינה, בהתחשב בשמה.

2.1. סיכום היישום

מכיוון שאנו מתמקדים בבניית הלקוח, לא ניכנס לפרטי היישום של השירות שלנו.

בואו מספיק לומר כי ממשק CountryService משמש לחשיפת שירות האינטרנט לעולם החיצוני. כדי לשמור על דברים פשוטים, אנו בונים ונפרוס את שירות האינטרנט באמצעות ה- javax.xml.ws.Endpoint ממשק API בכיתה שלנו CountryServicePublisher.

אנחנו נרוץ CountryServicePublisher כיישום Java לפרסום נקודת קצה שתקבל את הבקשות הנכנסות. במילים אחרות, זה יהיה השרת שלנו.

לאחר הפעלת השרת, לחיצה על כתובת ה- URL // localhost: 8888 / ws / country? wsdl נותן לנו את קובץ תיאור שירות האינטרנט. ה- WSDL משמש כמדריך להבנת הצעות השירות וליצור קוד יישום ללקוח.

2.2. שפת תיאור שירותי האינטרנט

בואו נסתכל על ה- WSDL של שירות האינטרנט שלנו, מדינה:

בקצרה, זהו המידע השימושי שהוא מספק:

  • אנחנו יכולים להפעיל את השיטה findByName עם חוּט טַעֲנָה
  • בתגובה, השירות יחזיר לנו סוג מותאם אישית של מדינה
  • סוגים מוגדרים ב- xsd סכמה שנוצרה במקום // localhost: 8888 / ws / country? xsd = 1:

זה כל מה שאנחנו צריכים כדי ליישם לקוח.

בואו נראה איך בחלק הבא.

3. שימוש wsimport כדי ליצור קוד לקוח

3.1. תוסף Maven

ראשית, בואו נוסיף תוסף ל- pom.xml להשתמש בכלי זה באמצעות Maven:

 org.codehaus.mojo jaxws-maven-plugin 2.6 wsimport-from-jdk wsimport // localhost: 8888 / ws / country? wsdl נכון com.baeldung.soap.ws.client.generated src / main / java 

שנית, בואו נבצע את התוסף הזה:

mvn נקי jaxws: wsimport

זה הכל! הפקודה לעיל תיצור קוד בחבילה שצוינה com.baeldung.soap.ws.client.generated בתוך ה sourceDestDir סיפקנו בתצורת התוסף.

דרך נוספת להשיג אותה תהיה שימוש ב- wsimport תוֹעֶלֶת. זה יוצא מהקופסה עם הפצת JDK 8 הסטנדרטית וניתן למצוא אותה תחת JAVA_HOME / bin מַדרִיך.

כדי ליצור קוד לקוח באמצעות wsimport, אנו יכולים לנווט לשורש הפרויקט ולהפעיל פקודה זו:

JAVA_HOME / bin / wsimport -s src / main / java / -keep -p com.baeldung.soap.ws.client.generated "// localhost: 8888 / ws / country? Wsdl"

חשוב לזכור כי נקודת הקצה של השירות צריכה להיות זמינה כדי לבצע בהצלחה את התוסף או הפקודה.

לאחר מכן, בואו נסתכל על החפצים שנוצרו.

3.2. נוצרו POJOs

מבוסס על ה xsd שראינו קודם, הכלי ייצור קובץ בשם מדינה.java:

@XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "country", propOrder = {"capital", "currency", "name", "population"}) מחלקה ציבורית מדינה {מוגנת הון מחרוזת; מטבע מטבע מוגן @XmlSchemaType (name = "string"); שם מחרוזת מוגן; אוכלוסייה מוגנת; // סטרים וקובעים סטנדרטיים}

כפי שאנו רואים, המחלקה שנוצרה מעוטרת בהערות JAXB לביצוע ורישום האובייקט אל XML וממנו.

כמו כן, הוא מייצר א מַטְבֵּעַ enum:

@XmlType (name = "currency") מטבע ציבורי @XmlEnum מטבע {EUR, INR, USD; ערך מחרוזת ציבורי () {return name (); } מטבע סטטי ציבורי מ- Value (String v) {return valueOf (v); }}

3.3. CountryService

החפץ השני שנוצר הוא ממשק הפועל כ- proxy לשירות האינטרנט בפועל.

הממשק CountryService מכריז על אותה שיטה כמו השרת שלנו, findByName:

@WebService (name = "CountryService", targetNamespace = "//server.ws.soap.baeldung.com/") @SOAPBinding (style = SOAPBinding.Style.RPC) @XmlSeeAlso ({ObjectFactory.class}) ממשק ציבורי CountryService { @WebMethod @WebResult (partName = "return") @Action (input = "//server.ws.soap.baeldung.com/CountryService/findByNameRequest", output = "//server.ws.soap.baeldung.com/CountryService / findByNameResponse ") מדינה ציבורית public findByName (@WebParam (name =" arg0 ", partName =" arg0 ") מחרוזת arg0); }

יש לציין כי הממשק מסומן כ- javax.jws.WebService, עם SOAPBinding.Style כ- RPC כהגדרתו ב- WSDL של השירות.

השיטה findByName מסומן כדי להצהיר שזה א javax.jws.WebMethod, עם סוגי פרמטרי הקלט והפלט הצפויים.

3.4. CountryServiceImplService

השיעור הבא שנוצר, CountryServiceImplService, מתארך javax.xml.ws.Service. ההערה שלה WebServiceClient מציין שזו תפיסת הלקוח של שירות:

@WebServiceClient (name = "CountryServiceImplService", targetNamespace = "//server.ws.soap.baeldung.com/", wsdlLocation = "// localhost: 8888 / ws / country? Wsdl") מחלקה ציבורית CountryServiceImplService מרחיב את השירות {גמר פרטי כתובת URL סטטית COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; פרטי סופי סטטי WebServiceException COUNTRYSERVICEIMPLSERVICE_EXCEPTION; פרטי סופי סטטי QName COUNTRYSERVICEIMPLSERVICE_QNAME = Qname חדש ("// server.ws.soap.baeldung.com/", "CountryServiceImplService"); סטטי {URL url = null; WebServiceException e = null; נסה {url = new URL ("// localhost: 8888 / ws / country? wsdl"); } לתפוס (MalformedURLException ex) {e = WebServiceException new (ex); } COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION = url; COUNTRYSERVICEIMPLSERVICE_EXCEPTION = e; } ציבורי CountryServiceImplService () {super (__ getWsdlLocation (), COUNTRYSERVICEIMPLSERVICE_QNAME); } // בנאים אחרים @WebEndpoint (name = "CountryServiceImplPort") ציבור CountryService getCountryServiceImplPort () {להחזיר super.getPort (QName חדש ("// server.ws.soap.baeldung.com/", "CountryServiceImplPort"), CountryService. מעמד); } כתובת אתר סטטית פרטית __getWsdlLocation () {if (COUNTRYSERVICEIMPLSERVICE_EXCEPTION! = null) {throw COUNTRYSERVICEIMPLSERVICE_EXCEPTION; } להחזיר COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; }}

השיטה החשובה לציין כאן היא getCountryServiceImplPort. ניתן שם מוסמך של נקודת סיום השירות, או QName, ושם ממשק נקודות הקצה של שירות ה- proxy הדינמי, הוא מחזיר מופע proxy.

כדי להפעיל את שירות האינטרנט, עלינו להשתמש ב- proxy זה, כפי שנראה בקרוב.

שימוש ב- Proxy גורם לנו להיראות כאילו אנו מתקשרים לשירות באופן מקומי, ומפשטים את המורכבויות של קריאה מרחוק.

4. בדיקת הלקוח

לאחר מכן נכתוב מבחן JUnit לחיבור לשירות האינטרנט באמצעות קוד הלקוח שנוצר.

לפני שנוכל לעשות זאת, עלינו להשיג את מופע ה- proxy של השירות בסוף הלקוח:

@BeforeClass הגדרת חלל סטטי ציבורי () {CountryServiceImplService שירות = CountryServiceImplService חדש (); CountryService countryService = service.getCountryServiceImplPort (); }

לתרחישים מתקדמים יותר כגון הפעלה או השבתה של WebServiceFeature, נוכל להשתמש בבנאים אחרים שנוצרו עבור CountryServiceImplService.

עכשיו בואו נסתכל על כמה בדיקות:

@ מבחן בטל פומבי givenCountryService_whenCountryIndia_thenCapitalIsNewDelhi () {assertEquals ("ניו דלהי", countryService.findByName ("הודו"). GetCapital ()); } @Test הציבור בטל givenCountryService_whenCountryFrance_thenPopulationCorrect () {assertEquals (66710000, countryService.findByName ("צרפת"). GetPopulation ()); } @Test ציבור בטל givenCountryService_whenCountryUSA_thenCurrencyUSD () {assertEquals (Currency.USD, countryService.findByName ("ארה"ב"). GetCurrency ()); } 

כפי שאנו רואים, הפעלת שיטות השירות המרוחק הפכה לפשוטה כמו שיטות שיחה מקומיות. של ה- proxy findByName השיטה החזירה א מדינה מופע התואם את שֵׁם סיפקנו. לאחר מכן, השתמשנו בגטרים שונים של POJO כדי לקבוע ערכים צפויים.

5. מסקנה

במדריך זה ראינו כיצד להפעיל שירות אינטרנט SOAP בג'אווה באמצעות JAX-WS RI ו- wsimport תוֹעֶלֶת.

לחלופין, אנו יכולים להשתמש במישומי JAX-WS אחרים כגון Apache CXF, Apache Axis2 ו- Spring כדי לעשות את אותו הדבר.

כמו תמיד, קוד המקור זמין ב- GitHub.