2012-06-11 16 views
8

Tôi đến từ C# vì vậy tôi nhận ra rằng tôi không thể mong đợi rất nhiều tính năng và khả năng sử dụng (tuyệt vời) có trong Java, nhưng gần đây tôi đã đưa vào dự án Java này và tôi chỉ đơn giản là không thể hình dung ra điều này. Trong C#/.NET làm cho các lớp proxy dịch vụ web và các hợp đồng dữ liệu được tạo ra là pie nhưng vì một lý do nào đó việc thực hiện Java các dịch vụ web dường như không đúng với tôi.Làm cách nào để bao gồm WSDL được đóng gói để sử dụng với các lớp Java được tạo bằng wsimport?

Đây là thỏa thuận ...

tôi sử dụng wsimport để tạo ra các tập tin được tạo từ các tập tin java .wsdl. Ví dụ ...

"%JAVA_HOME%\bin\wsimport" -quiet -extension -s .\src -d .\bin ".\wsdl\MyWSDL.wsdl" 

Tôi nhận thấy rằng đây mã hóa cứng (gõ cụm từ mà gần như làm tôi nôn chỉ là bây giờ) "wsdlLocation" như vị trí hiện tại của wsdl ("C: \ Users \ ME \ etc \ wsdl \ MyWSDL.wsdl "). Vì vậy, tôi lấy nó ra:

"%JAVA_HOME%\bin\wsimport" -quiet -extension -s .\src -d .\bin -wsdllocation "NULL" ".\wsdl\MyWSDL.wsdl" 

Bây giờ khi tôi nhanh chóng một dịch vụ được tạo ra ...

MyService xyz = new MyService(); 

tôi nhận được một lỗi. Một cái gì đó dọc theo dòng "không thể tìm thấy tập tin C: \ blahblah \ Temp \ NULL". OK ... quay lại bảng vẽ. Sau khi điều tra điều này một chút, tôi tìm thấy một bài đăng ở đây trên Stack Overflow đã nói về việc sử dụng "classpath: META-INF/WSDL.wsdl" là vị trí wsdl.

"%JAVA_HOME%\bin\wsimport" ... -wsdllocation "classpath:WSDLs/MyWSDL.wsdl" ".\wsdl\MyWSDL.wsdl" 
copy ".\wsdl\*" .\bin\WSDLs 
cd bin 
"%JAVA_HOME%\bin\jar" cf WebServiceProxies.jar * 

Lỗi!

"Unknown protocol: classpath" 

Thật kỳ lạ, bài đăng trên Stack Overflow được đánh dấu là câu trả lời. Tôi đoán có thể là trong hai năm qua, một số tiền phong nha đã thay đổi thành điểm "classpath:" không còn được hỗ trợ hoặc có phương pháp khác nhưng tôi không thể tìm ra câu trả lời .

OK, vì vậy tôi có một trong một số câu hỏi tôi cần được trả lời (cảm ơn trước !!!! Tôi sẽ đến đây!).

  1. Có cách nào để KHÔNG CẦN WSDL khi chạy không? Đối với những gì nó có giá trị, tôi nghĩ rằng đó là B.S. rằng nó cần điều này khi tôi khởi tạo các đối tượng. Bất kỳ cách nào để ngăn chặn yêu cầu này? Có lẽ nếu tôi sử dụng một công cụ khác ...?

  2. Nếu không có cách nào để mã này không cần WSDL khi chạy, làm cách nào để nhận mã WSDL từ gói này? Tôi đặt gì trong đối số wsdllocation để làm cho nó tải WSDL từ bên trong tệp JAR?

+0

Bài đăng của bạn rất dài. Tôi đoán rằng ít người có thể đọc toàn bộ bài đăng. – Max

+1

Được chỉnh sửa để làm cho bài đăng ngắn hơn bằng cách lấy ra các bài viết và củng cố một số thử nghiệm và lỗi đó. – bdzevel

+0

Sử dụng netbeans, bạn có thể tránh sử dụng các công cụ dòng lệnh, bạn trỏ đến WSDL tại và nó sẽ tự động tạo một bản sao trong 'META-INF \ wsdl' và đặt nó vào bình cuối cùng chứa dự án. (http://netbeans.org/kb/docs/websvc/jax-ws.html) – madth3

Trả lời

0

Kể từ khi cần thiết cho wsdl-at-runtime-bi kịch không bao giờ làm phiền tôi, tôi không có câu trả lời trên # 1. Điều đó nói rằng, việc sử dụng được đóng gói wsdl phải là phương tiện cuối cùng. Tôi thích sử dụng điểm cuối wsdl đã xuất bản. Vì vậy, vị trí wsdl thực tế sẽ là http(s)://host/name_of_service?wsdl cho hầu hết các khung lưu trữ hoặc http(s)://host/name_of_service.wsdl cho spring-ws.

Đối với mức độ phức tạp của chương trình webservice client java dựa trên, hãy để tôi cho bạn thấy một đoạn trích nhỏ từ một trong những dự án dựa maven tôi:

<plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-codegen-plugin</artifactId> 
    <version>2.6.1</version> 
<executions> 
    <execution> 
     <id>generate-sources</id> 
     <phase>generate-sources</phase> 
     <configuration> 
      <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot> 
      <wsdlOptions> 
       <wsdlOption> 
        <wsdl>https://XXXXXXXX/ws/loadsave?wsdl</wsdl> 
       </wsdlOption> 
      </wsdlOptions> 
     </configuration> 
     <goals> 
      <goal>wsdl2java</goal> 
     </goals> 
    </execution> 
</executions> 

Có lẽ Tôi không quá IDE- trung tâm, nhưng nó có vẻ khá đơn giản đối với tôi. Apache CXF là một trong những ngăn xếp webservice tốt nhất hiện có. (mặc dù tài liệu tôi sử dụng Fuse http://fusesource.com/docs/esb/3.5/fsf_se/JAXWSWSDLFirst.html. Về cơ bản thì CXF đã đổi tên thành tài liệu tốt hơn nhiều.)

Hy vọng rằng sẽ trả lời câu hỏi của bạn (ít nhất một phần).

trên java rant: Tôi không sử dụng công cụ MS trừ khi tôi phải làm, nhưng không phải vì tôi ghét họ. Công việc của tôi bằng cách nào đó đã đẩy tôi tới các dự án lớn hơn và rất hiếm khi thấy .net hỗ trợ trên các máy chủ cao cấp (hoặc thậm chí tầm trung cho vấn đề đó). Nó chỉ là một thực tế, mà sẽ không làm cho java tốt hơn sau đó. Nhưng tôi khá chắc chắn nếu tôi phải làm việc trên MS công cụ tôi sẽ làm quen với nó khá nhanh. Vì vậy, lời khuyên của tôi là: được hạnh phúc rằng công việc của bạn đã cho bạn một khả năng để tìm hiểu một cái gì đó mới và trân quý nó. Cuối cùng chúng tôi đang trong kinh doanh này bởi vì chúng tôi muốn học những điều mới tôi đoán.

+0

Hãy nhớ rằng một số dịch vụ web không xuất bản WSDL của họ tại URL. Chúng tôi đang tích hợp với UPS và đó là trường hợp ở đây. – IcedDante

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