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ố và 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 ...
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
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