2009-02-23 2 views
8

Chúng tôi đã viết một dịch vụ WCF được một cửa hàng Java sử dụng, đang sử dụng CXF để tạo các bộ điều hợp. Chúng tôi không quen thuộc với Java, nhưng đã tiếp xúc với dịch vụ bằng cách sử dụng basicHttpBinding, SSL và xác thực cơ bản. Kiểm tra tích hợp cho thấy một máy khách .NET có thể sử dụng dịch vụ tốt. Tuy nhiên, cửa hàng Java đang gặp khó khăn khi sử dụng dịch vụ. Cụ thể, chúng nhận được lỗi JAXB sau: Hai khai báo gây ra một xung đột trong lớp ObjectFactory. Điều này thường xảy ra nếu 2 hoạt động có cùng tên và không gian tên khi CXF cố gắng tạo các lớp bộ điều hợp.Cách tốt nhất để trưng ra một dịch vụ WCF để nó có thể dễ dàng được tiêu thụ từ Java/CXF là gì?

Chúng tôi không thể tìm thấy bất kỳ loại hoặc tên hoạt động nào sẽ gây ra bất kỳ loại xung đột nào. Chúng tôi đã đảm bảo rằng tất cả các loại tùy chỉnh chỉ định một không gian tên và tempuri.org không được chỉ định ở bất kỳ đâu trong WSDL. Cửa hàng Java nghi ngờ lỗi này là do WSDL được tạo có chứa < xsd: các phần tử nhập.

Vì vậy, câu hỏi của tôi:

  • Có cách nào tốt hơn CXF cho các cửa hàng Java tiêu thụ các dịch vụ WCF? Project Tango trông thú vị, nhưng tôi không biết đủ để bảo họ xem xét sử dụng nó. CXF có phải là tiêu chuẩn defacto trong Java không?
  • BasicHttpBinding/SSL/Basic Auth được MS đề xuất cho các tình huống interop, nhưng máy khách vẫn có vẻ có vấn đề về interop. Chúng ta có nên xem xét các ràng buộc hoặc cài đặt khác để làm cho việc này dễ tiêu thụ hơn không?
  • Có cách nào để định cấu hình WCF để luôn xuất ra một WDSL không có lược đồ nhập không?

Trả lời

4

Thông báo lỗi "Hai khai báo gây ra xung đột trong lớp ObjectFactory" thường không có gì liên quan đến nhập khẩu. Đó là thông báo lỗi JAXB thường được gây ra bởi có nhiều phần tử hoặc tương tự làm cho tên trường được tạo giống nhau. Ví dụ, nếu bạn có các yếu tố như:

< element name = "Foo" .../> và < element name = "foo" .../>

Điều đó có thể gây ra lỗi đó. Cách khác là sử dụng các dấu gạch nối và dấu gạch dưới và những thứ như vậy thường bị loại trừ + giới hạn: < tên phần tử = "doFoo" .../> và < tên phần tử = "do_foo" .../ >

Với 2.1.4, bạn có thể TRY chạy wsdl2java với cờ -autoNameResolution. SOMETIMES giúp với điều này, nhưng không phải lúc nào. Thật không may, thông tin mà JAXB đưa ra trong những trường hợp này gần như vô giá trị và rất nhiều lần, nó chỉ là thử và sai để tìm ra các loại xung đột. :-(

+0

Để ghi lại, có các loại trong dịch vụ WCF của tôi có tên là "OperationNameRequest" và "OperationNameResponse", xung đột với các loại cùng tên do java tạo ra. Java dev có thể sửa lỗi bằng cách xoa bóp WSDL. – Daniel

0

Cách duy nhất để ứng dụng khách java của bạn nói chuyện với thành phần WCF sẽ là một trong các phương thức HTTP - basicHttpBinding, ws *, v.v. giống như MS đề xuất. Java không thể nói chuyện với WCF qua TCP hoặc namedPipes hoặc MSMQ, v.v.

Tôi bắt đầu với một thành phần WCF siêu đơn giản - một cái gì đó với một phương pháp duy nhất để tách ra một chuỗi. Làm việc đó với Java và sau đó làm việc theo cách của bạn. Hãy chắc chắn rằng mọi thứ bạn đang phơi bày đang làm việc với các kiểu cơ sở hoặc các đối tượng [DataContract] được xác định rõ.

1

Tôi đã phát triển WCF với các máy khách Axis2. Các phương thức thẩm định mà tôi đã sử dụng thành công là BasicHttpBinding/SSL/Basic (Transport) và WS-Security với Username (và MTOM).

The Metro thực hiện được sử dụng bởi SUN và Microsoft để kiểm tra interop: http://weblogs.java.net/blog/haroldcarr/archive/2007/11/metro_web_servi.html

Xin lỗi không có đầu mối về nhập được tạo bởi WCF cho định nghĩa giản đồ.

0

Vấn đề với xsd: nhập khẩu là rất phổ biến Một số bộ công cụ hoặc runtimes không thể đối phó với điều đó Để giải quyết điều này, bạn có thể san bằng WSDL được tạo ra bởi WCF Kiểm tra this post

Về.... liệu CXF có phải là ngăn xếp Java đúng hay không - tôi chưa bao giờ nghe nói về nó? Tôi đã sử dụng AXIS thành công, cũng như JAX-WS Cả hai đều khá đơn giản. 01

1

Tôi sâu vào Java & Khả năng tương thích WCF. nói rằng bạn cần phải flatten WSDL của bạn nếu bạn đang làm việc với tập tin dựa trên WSDL.Tuy nhiên tôi sử dụng Netbeans 6,5 và nếu bạn trỏ đến một url thực như http://myservice/?wsdl, Netbeans có thể đối phó dễ dàng với wsdl mặc định được tạo bởi WCF. Trong cuộc sống thực, những thứ khác bạn cần xem xét là phiên bản dịch vụ, datamembers tùy chọn (không hoạt động tốt trong java, vì vậy tôi khuyên bạn nên thực hiện tất cả các datamembers IsRequired = true), đơn đặt hàng, v.v.

Điều khó khăn thực sự đi là an ninh. Tôi đã phải làm cho xác thực chứng chỉ lẫn nhau làm việc và nó vẫn có một số vấn đề.

0

Đây là sự cố Jaxb. Tôi chạy vào cùng một vấn đề nhưng sử dụng tùy chọn xmlbeans thay thế trong thế hệ khách hàng wsdl2java. Thành thật mà nói tôi dường như thích các đối tượng xmlbeans hơn jaxb như xa một người tiêu dùng để webservice này.