2009-03-18 24 views
10

Tôi có một lớp được chú thích là @XmlRootElement với @XmlAccessorType(XmlAccessType.NONE). Vấn đề mà tôi đang gặp là các phương thức của lớp cha đang bị ràng buộc, khi tôi không muốn chúng bị ràng buộc, và không thể cập nhật lớp. Tôi hy vọng có một chú thích mà tôi có thể đặt vào lớp phần tử gốc để ngăn chặn điều này xảy ra.Làm cách nào để ngăn JAXB khỏi các phương thức siêu lớp ràng buộc của @XmlRootElement khi marshalling?

Ví dụ:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.NONE) 
public class Person extends NamedObject { 

    @XmlElement 
    public String getId() { ... } 

} 

Tôi mong chờ rằng chỉ có phương pháp chú thích @XmlElement trên Person sẽ bị ràng buộc và marshalled, nhưng phương pháp của lớp cha đều bị ràng buộc, là tốt. Kết quả XML sau đó có quá nhiều thông tin.

Làm cách nào để ngăn các phương thức của siêu lớp bị ràng buộc mà không cần phải chú thích siêu lớp, chính nó?

Trả lời

6

Theo bài StackOverflow này: How can I ignore a superclass?

Nó không phải là có thể với JAX-B để bỏ qua các lớp cha mà không sửa đổi các lớp cha. Trích dẫn phần có liên quan của bài rằng:

Update2: Tôi tìm thấy a thread on java.net cho một vấn đề tương tự. Chủ đề đó dẫn đến một số enhancement request, được đánh dấu là bản sao của another issue, dẫn đến chú thích @XmlTransient. Các nhận xét về các báo cáo lỗi này dẫn tôi đến tin rằng điều này là không thể trong thông số kỹ thuật hiện tại .

+0

Bạn có thể cung cấp liên kết đến chuỗi đó trên java.net không? – Matt

+0

Đã thêm các liên kết từ phần được trích dẫn của vấn đề SO được tham chiếu. – benvolioT

5

Chỉ cần thêm

@XmlAccessorType(XmlAccessType.NONE) 

trước MỖI khai lớp cha (và các lớp chính nó).

Trong trường hợp của bạn:

@XmlAccessorType(XmlAccessType.NONE) 
class NamedObject{ 
    [ ... ] 
} 

Hãy nhớ rằng điều này đã được thực hiện thực sự cho mỗi lớp cha, nó thường quên khi giao dịch với cây phụ thuộc lớp lớn.

Giao diện, tất nhiên, không cần bất kỳ chú thích JAXB nào.

+0

Tôi muốn tránh phải đi vào các lớp siêu lớp, nhưng tôi cũng đã đi đến kết luận này. Cảm ơn câu trả lời. – Matt

1

Tôi đang đối mặt với cùng một vấn đề. Siêu lớp của tôi không xử lý bất kỳ chú thích JAXB nào (nó không phải) và tôi muốn lớp con của tôi không bao gồm các thuộc tính lớp con trong khi sắp xếp lại.

Thêm XmlAccesorType vào lớp cha không thể là giải pháp vì tôi không có cách nào để sửa đổi lớp cha.

Có giải pháp nào khác không?

+1

Bạn đã tìm thấy bất cứ điều gì liên quan đến điều này? – Matt

+0

Ghi đè thuộc tính và thêm chú thích '@ XMLTransient' vào nó. – HDave

3

Tôi biết câu hỏi này khá cũ, nhưng có một loại giải pháp hoạt động nếu lớp cha của bạn nằm trong cùng gói với con của nó.

Tạo một package-info.java trong gói của bạn và chèn

@XmlAccessorType(XmlAccessType.NONE) 
package my.package.with.classes; 

Rõ ràng, nó đặt XmlAccessType.NONE khi mọi tầng lớp trong gói. Bản thân tôi, tôi sử dụng nó trong mỗi gói trong mô hình miền của chúng tôi. Vì vậy, tôi khá an toàn. Tuy nhiên, nếu lớp học của bạn là 'ngoài tầm với', f.e. trong JDK, sử dụng giải pháp từ câu trả lời được chấp nhận trong [JAX-B] How can I ignore a superclass?.

Tôi hy vọng nó hữu ích cho bất kỳ ai không biết về câu hỏi này như tôi đã làm.

0

Thay thế triển khai JAX-B của bạn bằng MOXy và bạn có thể làm bất cứ điều gì mình muốn. Nó có rất nhiều phần mở rộng ở trên và vượt quá JAX-B bình thường, một trong số đó sẽ cho phép bạn bỏ qua các thuộc tính kế thừa, v.v. Nó cũng hỗ trợ chuyển các chú thích JAX-B sang tệp ánh xạ XML để bạn có thể giữ nhiều tập hợp ánh xạ .

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