Làm cách nào để thay đổi điểm cuối url của dịch vụ web?


101

Tôi đã tạo một ứng dụng khách dịch vụ web bằng JBoss utils (tương thích với JAX-WS) bằng cách sử dụng 'ứng dụng khách dịch vụ web từ một wsdl' của Eclipse.

Vì vậy, điều duy nhất tôi cung cấp là một url đến một WSDL dịch vụ web.

Bây giờ, nhà cung cấp dịch vụ web yêu cầu tôi thay đổi "url của quyền truy cập ứng dụng điểm cuối của khách hàng" của dịch vụ web.

Nó là gì và làm thế nào để thay đổi nó?


Bạn có thể tạo lại thứ bằng cách sử dụng cùng một trình hướng dẫn Eclipse với URL mới không?
Thilo

Nói với nhà cung cấp dịch vụ web rằng bạn cần url mới cho wsdl, sau đó sử dụng nó với trình hướng dẫn Eclipse để tạo lại ứng dụng khách.
systempuntoout

@Thilo @systemputoout GUYS, vấn đề là họ có cùng một URL WSDL !! Tôi không chắc, nhưng có vẻ như với tôi rằng trong Axis, bạn có thể cung cấp một URL khi gọi dịch vụ web. Trong JAX-WS, bạn không thể thay đổi "điểm cuối máy khách trong thời gian chạy". Bất kỳ ý tưởng, guys?
EugeneP

1
@ Pascal Thivent, @systempuntoout Cite: "URL hoặc điểm cuối để truy cập ứng dụng khách"
EugeneP 22/03/10

1
Vâng, cách hiểu của tôi về câu này là "khách hàng truy cập điểm cuối dịch vụ; vị trí điểm cuối đã thay đổi". Và điều này có ý nghĩa.
Pascal Thivent

Câu trả lời:


174

IMO, nhà cung cấp đang yêu cầu bạn thay đổi điểm cuối dịch vụ (tức là nơi để truy cập dịch vụ web), chứ không phải điểm cuối máy khách (tôi không hiểu điều này có thể là gì). Để thay đổi điểm cuối dịch vụ, về cơ bản bạn có hai tùy chọn.

Sử dụng Nhà cung cấp ràng buộc để đặt URL điểm cuối

Tùy chọn đầu tiên là thay đổi BindingProvider.ENDPOINT_ADDRESS_PROPERTYgiá trị thuộc tính của BindingProvider(mọi proxy triển khai javax.xml.ws.BindingProvidergiao diện):

...
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]));
...

Hạn chế là điều này chỉ hoạt động khi vẫn có thể truy cập được WSDL gốc. Không được khuyến khích.

Sử dụng WSDL để lấy URL điểm cuối

Tùy chọn thứ hai là lấy URL điểm cuối từ 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
Tôi nghĩ rằng có lỗi trong khối mã thứ hai, không phải là URL newEndpoint = URL mới ("WSDL_URL"); ở dòng đầu tiên ??
Jaime Hablutzel

3
đây là một liên kết đến một hướng dẫn tugdualgrall.blogspot.com/2009/02/…
shareef

12
Cần chỉ ra rằng các wsimportcông cụ hiện đại không tạo mã bằng một get[Service]Portphương thức nào nữa. Thay vào đó, hãy gọi get[Service]và truyền đối tượng kết quả thành a BindingProviderđể đặt các loại thuộc tính này.
Christopher Schultz

Cảm ơn @ChristopherSchultz về mẹo wsimport! Cái đó. đã làm việc cho chúng tôi
Cuga

1
Theo như tôi hiểu từ mã sơ khai được tạo cxf, tùy chọn thứ hai ở trên thay đổi url wsdl, không phải url dịch vụ. Tui bỏ lỡ điều gì vậy?
cacert

16

Để làm rõ thêm ở đây, khi bạn tạo dịch vụ của mình, lớp dịch vụ sử dụng 'wsdlLocation' mặc định, được chèn vào nó khi lớp được xây dựng từ wsdl. Vì vậy, nếu bạn có một lớp dịch vụ được gọi là SomeService và bạn tạo một thể hiện như sau:

SomeService someService = new SomeService();

Nếu bạn nhìn vào bên trong SomeService, bạn sẽ thấy rằng hàm tạo trông giống như sau:

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

Vì vậy, nếu bạn muốn nó trỏ đến một URL khác, bạn chỉ cần sử dụng hàm tạo nhận đối số URL (có 6 hàm tạo để đặt qname và các tính năng). Ví dụ: nếu bạn đã thiết lập một bộ giám sát TCP / IP cục bộ đang lắng nghe trên cổng 9999 và bạn muốn chuyển hướng đến URL đó:

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

và điều đó sẽ gọi hàm tạo này bên trong dịch vụ:

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

2
Không cần thiết. Tôi có các dịch vụ được tạo bằng wsdl2java của Apache CXF và ngay cả khi chúng tôi chuyển vị trí wsdl mới cho phương thức khởi tạo, các cổng của nó vẫn cố gắng liên kết với vị trí được đặt tại thời gian biên dịch / tạo (không để lại bất kỳ lựa chọn nào ngoài việc nhập cổng vào BindingProvider và thiết lập các địa chỉ mới trong bản đồ bối cảnh yêu cầu của nó).
luis.espinal

1
@Luis - Khó biết chính xác những gì bạn đang thấy, nhưng nếu bạn gỡ lỗi, bạn sẽ thấy lệnh gọi vào lớp Nhà cung cấp javax và sau đó thấy nó cố gắng tạo điểm cuối với vị trí wsdl mới của bạn (giả sử bạn đang sử dụng JAX-WS 2.0 +). Sau đó, bên trong dịch vụ của bạn, cuộc gọi getPort sẽ gọi super.getPort, sử dụng có cổng mới của bạn được đặt trong đối tượng serviceDelegate. Đó là cách nó sẽ hoạt động với javax.xml.ws.Service trong JAX-WS 2.0. Tôi đã đặt một điểm dừng cho cuộc gọi siêu và điều tra từ đó.
MattC

0

Tôi sẽ không đi xa với @Femi để thay đổi thuộc tính địa chỉ hiện có. Bạn có thể thêm các dịch vụ mới vào phần định nghĩa một cách dễ dàng.

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

Điều này không yêu cầu biên dịch lại WSDL sang Java và việc cập nhật không khó hơn nếu bạn sử dụng tùy chọn BindingProvider (không hoạt động với tôi btw).


-6

Để thay đổi thuộc tính địa chỉ kết thúc, hãy chỉnh sửa tệp wsdl của bạn

<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
Trong nhiều trường hợp, WSDL được áp dụng cho bạn và bạn không được phép thay đổi nó. Quan trọng hơn, từ một môi trường sang môi trường khác (thử nghiệm so với trực tiếp), url điểm cuối có khả năng thay đổi .. và không ai muốn chỉnh sửa wsdl và biên dịch lại trong trường hợp này.
Myobis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.