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
.
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. –