จะเปลี่ยนปลายทาง url ของบริการเว็บได้อย่างไร?


101

ฉันสร้างไคลเอ็นต์บริการเว็บโดยใช้ยูทิลิตี้ JBoss (เข้ากันได้กับ JAX-WS) โดยใช้ Eclipse 'เว็บเซอร์วิสไคลเอ็นต์จาก wsdl'

ดังนั้นสิ่งเดียวที่ฉันให้คือ url ไปยัง WSDL บริการเว็บ

ตอนนี้ผู้ให้บริการเว็บแจ้งให้ฉันเปลี่ยน "url ของการเข้าถึงแอปพลิเคชันปลายทางไคลเอ็นต์" ของบริการบนเว็บ

มันคืออะไรและจะเปลี่ยนได้อย่างไร?


คุณสามารถสร้างสิ่งใหม่โดยใช้วิซาร์ด Eclipse เดียวกันกับ URL ใหม่ได้หรือไม่?
Thilo

แจ้งผู้ให้บริการเว็บว่าคุณต้องการ url ใหม่เพื่อ wsdl จากนั้นใช้กับวิซาร์ด Eclipse เพื่อสร้างไคลเอ็นต์ใหม่
systempuntoout

@Thilo @systemputoout GUYS ปัญหาคือพวกเขามี URL WSDL เดียวกัน !! ฉันไม่แน่ใจ แต่สำหรับฉันแล้วดูเหมือนว่าใน Axis คุณสามารถระบุ URL เมื่อเรียกใช้บริการเว็บ ใน JAX-WS คุณไม่สามารถเปลี่ยน "จุดสิ้นสุดไคลเอ็นต์ระหว่างรันไทม์" ความคิดใด ๆ พวก?
EugeneP

1
@ Pascal Thivent, @systempuntoout อ้างอิง: "URL หรือจุดสิ้นสุดสำหรับการเข้าถึงแอปพลิเคชันไคลเอนต์"
EugeneP

1
ความเข้าใจของฉันเกี่ยวกับประโยคนี้คือ "ลูกค้าเข้าถึงปลายทางของบริการตำแหน่งปลายทางมีการเปลี่ยนแปลง" และนี่ก็สมเหตุสมผล
Pascal Thivent

คำตอบ:


174

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

ใช้ Binding Provider เพื่อตั้งค่า endpoint URL

ตัวเลือกแรกคือการเปลี่ยนBindingProvider.ENDPOINT_ADDRESS_PROPERTYค่าคุณสมบัติของBindingProvider(ทุกjavax.xml.ws.BindingProviderอินเทอร์เฟซการใช้พร็อกซี):

...
EchoService service = new EchoService();
Echo port = service.getEchoPort();

/* Set NEW Endpoint Location */
String endpointURL = "http://NEW_ENDPOINT_URL";
BindingProvider bp = (BindingProvider)port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);

System.out.println("Server said: " + echo.echo(args[0]));
...

ข้อเสียเปรียบคือจะใช้ได้เฉพาะเมื่อ WSDL ดั้งเดิมยังสามารถเข้าถึงได้ ไม่แนะนำ.

ใช้ WSDL เพื่อรับ URL ปลายทาง

ตัวเลือกที่สองคือรับ URL ปลายทางจาก WSDL

...
URL newEndpoint = new URL("NEW_ENDPOINT_URL");
QName qname = new QName("http://ws.mycompany.tld","EchoService"); 

EchoService service = new EchoService(newEndpoint, qname);
Echo port = service.getEchoPort();

System.out.println("Server said: " + echo.echo(args[0]));
...

7
ฉันคิดว่ามีข้อผิดพลาดในบล็อกรหัสที่สองไม่ควรเป็น URL newEndpoint = URL ใหม่ ("WSDL_URL"); ในบรรทัดแรก ??
Jaime Hablutzel

3
นี่คือลิงค์ไปยังคลิป
shareef

12
ควรชี้ให้เห็นว่าwsimportเครื่องมือสมัยใหม่ไม่ได้สร้างโค้ดด้วยget[Service]Portวิธีการอีกต่อไป ให้เรียกget[Service]และโยนวัตถุที่เป็นผลลัพธ์เป็น a BindingProviderเพื่อตั้งค่าคุณสมบัติประเภทนี้แทน
Christopher Schultz

ขอบคุณ @ChristopherSchultz ในเคล็ดลับ wsimport! def นั้น ทำงานให้เรา
Cuga

1
เท่าที่ฉันเข้าใจจากโค้ด cxf ที่สร้างขึ้นตัวเลือกที่สองด้านบนเปลี่ยน wsdl url ไม่ใช่ url บริการ ฉันพลาดอะไรไปรึเปล่า?
cacert

16

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

SomeService someService = new SomeService();

หากคุณดูภายใน SomeService คุณจะเห็นว่าตัวสร้างมีลักษณะดังนี้:

public SomeService() {
        super(__getWsdlLocation(), SOMESERVICE_QNAME);
}

ดังนั้นหากคุณต้องการให้ชี้ไปที่ URL อื่นคุณเพียงแค่ใช้ตัวสร้างที่รับอาร์กิวเมนต์ URL (มีตัวสร้าง 6 ตัวสำหรับการตั้งค่า qname และคุณสมบัติเช่นกัน) ตัวอย่างเช่นหากคุณตั้งค่าการมอนิเตอร์ TCP / IP ในเครื่องที่กำลังรับฟังบนพอร์ต 9999 และคุณต้องการเปลี่ยนเส้นทางไปยัง URL นั้น:

URL newWsdlLocation = new URL("http://theServerName:9999/somePath");
SomeService someService = new SomeService(newWsdlLocation);

และจะเรียกตัวสร้างนี้ภายในบริการ:

public SomeService(URL wsdlLocation) {
    super(wsdlLocation, SOMESERVICE_QNAME);
}

2
ไม่จำเป็น. ฉันมีบริการที่สร้างขึ้นด้วย wsdl2java ของ Apache CXF และแม้ว่าเราจะส่งตำแหน่ง wsdl ใหม่ไปยังตัวสร้างพอร์ตของมันก็ยังคงพยายามเชื่อมโยงกับตำแหน่งที่ตั้งไว้ในเวลาคอมไพล์ / สร้าง (ไม่เหลือทางเลือกใด ๆ นอกจากพิมพ์พอร์ตไปยัง BindingProvider และ ตั้งค่าที่อยู่ใหม่ในแผนที่บริบทคำขอ)
luis.espinal

1
@ Luis - ยากที่จะรู้ว่าคุณกำลังเห็นอะไรอยู่ แต่ถ้าคุณดีบักคุณควรเห็นการโทรเข้าสู่คลาสผู้ให้บริการ javax จากนั้นลองสร้างจุดสิ้นสุดด้วยตำแหน่ง wsdl ใหม่ของคุณ (สมมติว่าคุณใช้ JAX-WS 2.0 +). จากนั้นภายในบริการของคุณการโทร getPort ควรเรียกใช้ super.getPort ซึ่งใช้มีพอร์ตใหม่ของคุณตั้งอยู่ในวัตถุ serviceDelegate นั่นเป็นวิธีที่ควรใช้กับ javax.xml.ws.Service ใน JAX-WS 2.0 ฉันจะกำหนดจุดพักในการโทรขั้นสูงและตรวจสอบจากที่นั่น
MattC

0

ฉันจะไม่ไปไกลถึง @Femi เพื่อเปลี่ยนคุณสมบัติที่อยู่ที่มีอยู่ คุณสามารถเพิ่มบริการใหม่ในส่วนคำจำกัดความได้อย่างง่ายดาย

<wsdl:service name="serviceMethodName_2">
  <wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
    <soap:address location="http://new_end_point_adress"/>
  </wsdl:port>
</wsdl:service>

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


-6

หากต้องการเปลี่ยนคุณสมบัติ end address ให้แก้ไขไฟล์ wsdl ของคุณ

<wsdl:definitions.......
  <wsdl:service name="serviceMethodName">
    <wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
      <soap:address location="http://service_end_point_adress"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

11
ในหลาย ๆ กรณี WSDL จะถูกบังคับให้คุณและคุณไม่ควรเปลี่ยนแปลง ที่สำคัญกว่านั้นจากสภาพแวดล้อมไปยังอีกสภาพหนึ่ง (ทดสอบเทียบกับการใช้งานจริง) URL ปลายทางมีแนวโน้มที่จะเปลี่ยนแปลง .. และไม่มีใครต้องการปรับแต่ง wsdl และคอมไพล์ใหม่ในกรณีนี้
Myobis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.