2010-02-05 55 views
29

Chúng tôi sử dụng phương pháp "bắt đầu từ Java" để tạo các dịch vụ web JAX-WS 2.0 bằng cách sử dụng ngăn xếp Metro 1.5. Khi chúng ta trỏ một công cụ chuẩn như SoapUI vào một trong các dịch vụ web của chúng ta, nó chỉ ra rằng các tham số cho WebMethods là tùy chọn. Các xsd tạo ra cho thấy minOccurs = 0.Làm cách nào để tạo tham số WebMethod yêu cầu

Tôi cần một cách để thực hiện các tham số WebMethod cần thiết (có thể minOccurs = 1 trong xsd) trong phương pháp "bắt đầu từ Java". Tôi nghĩ rằng có một chú thích Java cho điều này, nhưng tôi đã không thể tìm thấy một. Chú thích XmlElement đã yêu cầu thuộc tính, nhưng XmlElement không thể được áp dụng cho các tham số WebMethod.

Có cách nào để thực hiện các tham số WebMethod của tôi được yêu cầu không, ngắn gọn của việc chỉnh sửa thủ công xsd và thiết lập minOccurs thành 1?

Trả lời

28

Tôi đã xác minh rằng Metro 2.0 cho phép bạn đặt @XmlElement(required=true) trên tham số. Xsd được tạo không có minOccurs=0. Nó để lại minOccurs trong số xsd được tạo để nó giả định giá trị mặc định là 1.

Bạn cũng phải nâng cấp JDK của mình bằng cách đặt JAX-WS 2.2 webservices-api.jar trong thư mục endorsed/.

Tôi đã đăng cùng một câu hỏi on the Java forums.

Nhờ jitu cho cả hai câu trả lời và chỉ ra rằng minOccurs mặc định là 1 vì vậy để nó ra khỏi .xsd có hiệu quả mong muốn.

Khi @XmlElement (required = true) được đặt trên tham số SoapUI không còn chỉ ra rằng tham số là tùy chọn.

6

XSD được tạo cho thấy minOccurs = 0.

Đây là một đặc điểm kỹ thuật: bất kỳ nguyên thủy nào không bắt buộc đều là tùy chọn, chỉ bắt buộc phải có nguyên thủy.

Tôi cần một cách để thực hiện các tham số WebMethod cần thiết (có thể minOccurs = 1 trong xsd) trong phương pháp "bắt đầu từ Java".

Điều này là không thể, trừ khi bạn sử dụng nguyên thủy như đã đề cập trước đây. Và thực tế, đây là một trong những lý do tại sao Java đầu tiên hút (vâng, các nhà phát triển thích nó nhưng it just does not work): mong manh của nó, hợp đồng có thể thay đổi (!), Nó không cung cấp cho bạn tất cả các điều khiển bạn cần , nó không phải là fit well with WS-Security, v.v. Vì vậy, thực sự, contract-first là không dễ chịu, nhưng ít nhất, nó hoạt động.

+0

Cảm ơn nhận xét và liên kết. Tôi muốn những cuốn sách dịch vụ web cồng kềnh ở đó (một số trong đó tôi đã đọc - tôi có nghĩa là lội qua) sẽ chỉ nói điều này rõ ràng như bạn có. –

+0

@Dean Bạn được chào đón. Và cảm ơn phản hồi về JAX-WS 2.2 (ngay cả khi điều này không thực sự nằm trong phạm vi của câu hỏi ban đầu). –

+2

Tôi sẽ nói rằng WSDL-đầu tiên bằng nhau không hoạt động. Blog bạn liên kết để nói về việc sử dụng các đối tượng Yêu cầu và Trả về phức tạp để gói, nhưng điều này trình bày một số vấn đề, chẳng hạn như ẩn những thứ cần thiết trong các trường cơ bản, lạm dụng tái sử dụng, v.v ... Ví dụ về một cái gì đó tốt như sử dụng Spring và proxy để làm cho một cái gì đó giống như một WebService xuất hiện như là một thực hiện đơn giản của một giao diện cục bộ. Tăng cường giao diện cục bộ của bạn theo cách này là một phần của những gì ngăn bạn quên rằng đó là một dịch vụ * xảy ra * được hiển thị thông qua JAX-WS. – jcalvert

2

Đây là một cuộc thảo luận khác của cùng một câu hỏi này. Theo phản hồi, Metro 2.0 hỗ trợ việc đưa @XmlElement vào một tham số phương thức để giải quyết vấn đề của tôi.

http://forums.java.net/jive/thread.jspa?messageID=385565&#385565

Metro 2.0 được phát hành vào ngày 10 Tháng 12 2009 để nó không còn trong EA. Tôi sẽ thử xem nó có hiệu quả không.

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