2010-01-25 26 views
5

Tôi đang cố gắng tạo jar khách hàng WS trực tiếp từ lớp @Webservice.Tạo ứng dụng khách dịch vụ web trực tiếp từ nguồn

Hãy lấy ví dụ này:

package com.example.maven.jaxws.helloservice; 
    import javax.jws.WebService; 
    @WebService 
    public class Hello { 
    public String sayHello(String param) { 
    ; return "Hello " + param; 
    } 
    } 

tôi có thể tạo ra một tập tin chiến tranh và sử dụng để phục vụ glassfish webservice này, và từ đó tôi có thể sử dụng URL WSDL glassfish để tạo ra nguồn khách hàng.

Điều tôi đang cố gắng làm là bỏ qua phần thủy tinh. Từ dự án maven của tôi định nghĩa webservice, tôi muốn sử dụng jaxws-maven-plugin để tạo các lớp máy khách nhưng tôi không thể tìm thấy bất kỳ cách nào để chỉ định URL thực tế của webservice.

Điều đó có thể đúng không?

@see cũng Creating a web-service client with a known but inaccessible wsdl

Trả lời

3

Bạn nên sử dụng tùy chọn <wsdlLocation> để cung cấp vị trí của dịch vụ nơi tệp WSDL sẽ khả dụng sau khi triển khai.

Sử dụng -wsdlLocation switch

Có một cách dễ dàng để làm điều đó - chỉ cần chạy wsimport với -wsdlLocation chuyển đổi và cung cấp vị trí WSDL giá trị đó là tương đối so với lớp dịch vụ được tạo ra và bạn cần để đặt tệp WSDL này tại vị trí tương đối này.

See the post for more details.

+0

Vì vậy, bạn nói rằng bạn nên tải xuống bản sao WSDL từ lần chạy trước. Đối với Metro, điều này có thể khó vì nó chứa tra cứu bổ sung. –

5

Tạo một ứng dụng khách dịch vụ web luôn luôn bắt đầu với một tập tin WSDL hiện có (không giống như đang phát triển cung cấp dịch vụ web), và thậm chí nếu điều này không phải là cách duy nhất, tôi muốn đề nghị sử dụng công cụ wsimport (xem 5 Techniques for Creating Java Web Services from WSDL để biết các tùy chọn khác nhưng tôi sẽ không bao gồm chúng).

Vì vậy, trong dự án khách hàng của bạn, hãy thêm đoạn sau đây để pom.xml của bạn:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>jaxws-maven-plugin</artifactId> 
     <executions> 
     <execution> 
      <goals> 
      <goal>wsimport</goal> 
      </goals> 
      <configuration> 
      <wsdlUrls> 
       <wsdlUrl> 
       http://localhost:8080/helloservice/HelloService?wsdl 
       </wsdlUrl> 
      </wsdlUrls> 
      <packageName>com.example.maven.jaxws.helloclient</packageName> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
<bulid> 

Các mojo jaxws-maven-plugin:wsimport bị ràng buộc bởi mặc định sang giai đoạn chu kỳ generate-sources cuộc sống để chạy bất kỳ giai đoạn sau để generate-sources sẽ kích hoạt jaxws:wsimport mục tiêu.

Lưu ý rằng đây thực sự là cấu hình tối thiểu. Nếu bạn muốn biết thêm chi tiết/kiểm soát, hãy kiểm tra tài liệu của moóc wsimport.

Ví dụ, để sử dụng tập tin thay vì URL cho WSDL (và để tạo ra mã Java trong một vị trí phù hợp hơn với maven thực hành tốt nhất), sử dụng:

<configuration> 
    <sourceDestDir>${project.build.directory}/generated-sources/wsimport</sourceDestDir> 
    <wsdlDirectory>${basedir}/src/wsdl</wsdlDirectory> 
    <wsdlFiles> 
    <wsdlFile>foo.wsdl</wsdlFile> 
    <wsdlFile>bar.wsdl</wsdlFile> 
    </wsdlFiles> 
    ... 
</configuration> 

Cập nhật: Để gọi một trước còn sơ khai -configured (sử dụng địa chỉ endpoint từ WSDL), mã này là:

Hello port = new HelloService().getHelloPort(); 
String result = port.sayHello("Duke!"); 

để gọi một thiết bị đầu cuối có địa chỉ khác với một quy định trong WSDL, xác định các URL endpoint mới và QName :

URL endpoint_new = new URL("NEW_ADDRESS_HERE"); 
QName qname = new QName("http://"+"ORIGINAL_PACKAGE", "SERVICENAME"); 
Hello port = new HelloService(endpoint_new, qname).getHelloPort(); 

nơi ORIGINAL_PACKAGE là gói nơi dịch vụ được công bố trên, SERVICENAME là tên của dịch vụ chúng ta cần, ví dụ, HelloService.

+0

Nếu tôi sử dụng giải pháp cuối cùng của bạn (tạo ứng dụng khách từ tệp wsdl), thì lọ khách hàng sẽ không chứa URL của webservice. Có cách nào để cung cấp nó với maven không? Tôi chỉ thấy thẻ nhưng không có gì khác ... – ben

+0

Điều này rất hữu ích; Cảm ơn nhiều! –

+1

Khi sử dụng '@ WebService' với Metro, WSDL được tạo ra trong thời gian chạy và do đó có thể không có sẵn tại thời gian biên dịch. –

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