2010-08-25 21 views
44

Sử dụng mã được tạo với wsimport, điểm cuối dịch vụ có thể bị ghi đè mà không phải tạo lại mã không?ghi đè hoặc đặt điểm cuối dịch vụ web khi chạy cho mã được tạo bằng wsimport

Tôi đã viết một webservice java đơn giản, sau đây là các bước:

  1. tôi biên dịch lớp java và tạo ra một tập tin chiến tranh
  2. Triển khai tập chiến tranh đến máy chủ ứng dụng của tôi (tomcat)
  3. Truy cập WSDL qua URL ví dụ localhost: 8080/dịch vụ/helloservice wsdl
  4. sử dụng URL với wsimport.bat để tạo ra các lớp khách hàng ví dụ: wsimport http://localhost:8080/service/helloservice?Wsdl
  5. tôi sử dụng những lớp trong ứng dụng của khách hàng của tôi để gọi dịch vụ

Vấn đề đó là dịch vụ được triển khai trên một máy chủ ứng dụng đang chạy trên cổng khác với 8080, giao tiếp giữa khách hàng và dịch vụ không bao giờ xảy ra. Tôi đang cố gắng để biết cách tốt nhất để tạo ra sơ khai mà không có máy chủ và cổng hardcoded trong cuống được sử dụng bởi khách hàng là gì.

+0

Câu hỏi liên quan: http://stackoverflow.com/questions/3567856/changing-the-url-on-a-webservice-client-generated-with-wsimport – McDowell

Trả lời

75

Khách hàng của bạn có thể đặt điểm cuối trong "cổng" dịch vụ khi chạy qua giao diện BindingProvider.

Xem xét ứng dụng khách JAX-WS ở this JAX-WS tutorial. Một cách khác để viết mã này sẽ là:

HelloService service = new HelloService(); 
Hello port = service.getHelloPort(); 
BindingProvider bindingProvider = (BindingProvider) port; 
bindingProvider.getRequestContext().put(
     BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
     "http://foo:8086/HelloWhatever"); 
String response = port.sayHello(name); 

Lưu ý: Tôi chưa tải xuống mã hướng dẫn và đã thử nghiệm mã này chống lại nó.

+0

Cảm ơn, đó là những gì tôi đang tìm kiếm. – user363808

+0

Tôi đang xem xét điều này. Rõ ràng với mã được tạo ra với các phiên bản gần đây của JAX-WS wsimport, WSDL phải có thể truy cập tại địa chỉ được chỉ định cho wsimport tại thời điểm 'new HelloService()' được thực hiện (trước khi nhà cung cấp liên kết thậm chí có cơ hội khởi động). Là cách duy nhất để sửa lỗi này, để có một bản sao cục bộ của WSDL có thể được phân tích cú pháp sao cho hàm tạo thành công? –

+0

@ ThorbjørnRavnAndersen Nếu bộ nhớ phục vụ bạn có thể đặt vị trí WSDL thành bất kỳ thứ gì bạn muốn vào thời gian thế hệ - hãy xem đối số '-wsdllocation' cho [wsimport] (http://download.oracle.com/javase/6/docs/technotes/tools/# webservices) công cụ. Nhưng tôi thường sẽ cung cấp nó một cách rõ ràng trong một khách hàng không được quản lý - [ví dụ] (http://illegalargumentexception.blogspot.co.uk/2011/04/java-jax-ws-web-services-and-clients.html#ws_client) . – McDowell

-1

tôi phải đối mặt với cùng một vấn đề, và nó đã coz khủng khiếp khi đang chuyển sang sản xuất nó luôn luôn tìm kiếm những vị trí WSDL hardcoded tức là Windows C: ........ vv

Tôi có đã đi qua các bài đăng và trang khác nhau để tìm câu trả lời tuy nhiên tất cả đều thất bại sau đó tìm thấy chính mình một cách bằng cách xem Lớp dịch vụ được tạo bởi các JAX-WS nhập khẩu.

Tôi phải ghi đè cài đặt vị trí WSDL JAX-WS trong lớp gọi điện thoại của tôi như thế này.

URL baseUrl; 
URL wsdlURL = null; 
baseUrl = <your Services>.class.getResource("."); 
try { 
    wsdlURL = new URL(baseUrl, "http://<your path>?wsdl"); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
} 

<your Services> yourServices = new <your Services(wsdlURL,new QName("your namespace", "<your service name>")); 
System.out.println(Services.getWSDLDocumentLocation()); 
YourInterface YourInterfacePort = yourServices.getServicePort(); 
BindingProvider bindingProvider = (BindingProvider)YourInterfacePort; 
bindingProvider.getRequestContext().put(
      BindingProvider.ENDPOINT_ADDRESS_PROPERTY,  url); 

YourInterfacePort.methods();

Các vấn đề liên quan