2012-07-11 31 views
5

JAX-WS yêu cầu tất cả các lớp được truyền có một contructor mặc định (constructor không có arg). Tôi không hiểu yêu cầu đó bởi vì các máy khách tạo các lớp riêng của họ dựa trên WSDL. IMO yêu cầu này chỉ có ý nghĩa đối với các lớp được sử dụng làm tham số đầu vào của Webservice.Tại sao một hàm tạo mặc định được yêu cầu cho các đối tượng được xuất khẩu bởi JAX-WS?

Có ai biết cách phá vỡ yêu cầu đó không?

Trả lời

6

Khi bạn sử dụng JAX-WS bạn đang sử dụng một JAXB thực hiện để serialize đối tượng java của bạn để XML.

Vì vậy, 'vấn đề' là cách JAXB hoạt động.

Để sử dụng JAXB, bạn cần phải tạo ra một JAXBContext đi qua nó tất cả các lớp có thể được marshaled/unmarshaled. Khi tạo ngữ cảnh, JAXB sẽ kiểm tra xem tất cả các lớp đã có có hàm tạo không-arg hay không. Nếu ít nhất một trong các lớp đó không có kiểu hàm tạo này, ngữ cảnh sẽ không được tạo ra.

Tại sao JAXB làm điều này? Nó chỉ cần hàm tạo no-arg này khi chuyển đổi từ XML thành Object (unmarshalling), nhưng vấn đề là khi bạn đang tạo ngữ cảnh, JAXB không biết bạn muốn làm gì (nguyên soái hoặc bất định)!

Kết luận: JAXB sẽ chỉ chấp nhận các lớp mà nó có thể soái và không chính thức. Thông tin thêm here

Biết điều này, điều gì xảy ra trong JAX-WS?

Khi bạn khai báo một @WebMethod các thông sốgiá trị trả về lớp sẽ được thêm vào một bối cảnh JAXB. Và bởi vì điều này mà tất cả các lớp liên quan đến đầu vào và đầu ra dịch vụ web cần một hàm tạo no-arg.

Kết luận: là JAXB lỗi ;-)

Nhưng nếu tôi cần phải sử dụng một lớp học mà không có một constructor không có arg?

Bạn có thể sử dụng XMLAdapter! Kiểm tra this post để biết thêm thông tin ...

+0

Vì vậy, vấn đề dường như là JAXB không phân biệt giữa các lớp mà nó phải sắp xếp hoặc thay đổi thứ tự. Nếu tính năng này được hỗ trợ thì JAX-WS có thể xây dựng một JAXBContext tương ứng. Tôi nghĩ rằng sẽ tạo ra một yêu cầu tính năng tốt đẹp cho một đặc tả JAXB sắp tới. – Stefan

+0

Tôi mạnh mẽ đồng ý với bạn. Trên thực tế, những người từ MOXy (thực hiện JAXB bởi EclipseLink) có một vé mở để thêm hỗ trợ các nhà xây dựng đa args: https://bugs.eclipse.org/bugs/show_bug.cgi?id=328951 – ggarciao

0

Có ai biết cách phá vỡ yêu cầu đó không?

Có - viết lại JAX-WS.

Nó có thể sử dụng một ctor mặc định và phản ánh để cư trú đối tượng, bởi vì nó không thể dễ dàng biết về mọi ctor có thể mà một người như bạn có thể viết.

Đây là nhược điểm của việc sử dụng khung của người khác: bạn phải chơi theo quy tắc của họ.

khách hàng tạo ra các lớp học riêng của họ dựa trên WSDL

Tôi nghĩ đó là những gì thư viện giúp khách hàng làm. Bạn không viết mã để phân tích và giải thích WSDL, phải không?

+0

Các đối tượng không được điền bởi JAX-WS ở phía máy chủ. JAX-WS chỉ truyền chúng. – Stefan

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