2012-06-10 26 views
29

tôi có 2 lớp:lĩnh vực Ngoại trừ trong JAXB

@XmlRootElement 
public class A { 

    private Long id; 
    private B b; 

    // setters and getters 
} 

@XmlRootElement 
public class B { 

    private Long id; 
    private String field1; 
    private String field2; 

    // setters and getters 
} 

Theo mặc định, nếu tôi chuyển đổi một thể hiện của lớp A đến XML, tôi sẽ có tất cả các lĩnh vực của nó (id) và các trường tham chiếu B lớp học (id, field1, field2) như sau:

<a> 
    <id>2</id> 
    <b> 
     <id>5</id> 
     <field1>test1</field1> 
     <field2>test3</field2> 
    </b> 
</a> 

Is có thể sửa đổi lĩnh vực từ tham chiếu lớp B được bao gồm trong XML của lớp A? Ví dụ. Tôi muốn nói rằng khi tôi chuyển đổi một thể hiện của A lớp, tôi chỉ muốn để có được id từ B lớp (không field1field2 lĩnh vực), vì vậy tôi muốn nhận được:

<a> 
    <id>2</id> 
    <b> 
     <id>5</id> 
    </b> 
</a> 

Tôi không muốn vĩnh viễn chú thích các lớp B (sử dụng @XMLTransient hay @XMLElement) để đạt được nó, như có những trường hợp trong đó tôi muốn xuất cả lớp B như là (với id, field1field2.)
tôi chỉ không muốn xuất tất cả các trường này khi lớp học B được tham chiếu từ A.

Điều này có thể thực hiện được với JAX-B không?

Trả lời

7

Các ràng buộc JAXB mặc định có thể được ghi đè theo phạm vi toàn cầu hoặc trên cơ sở từng trường hợp khi cần thiết bằng cách sử dụng custom binding declarations hoặc sử dụng @XmlTransient trên trường.

+0

Cảm ơn! Tôi đoán nó phức tạp một chút nếu tôi đang sử dụng Glassfish JAXB thực hiện ... Có vẻ như không có giải pháp dựa trên chú thích và tôi cần phải tạo một XML tùy chỉnh bổ sung? –

86

Bạn có thể sử dụng chú thích @XmlTransient để bỏ qua các trường. Đặt chú thích này vào chính trường đó hoặc trình thu thập của nó.

+0

Tôi nên đặt nó ở đâu? Trên các trường 'B' lớp' field1' và 'field2'? Nó sẽ không gây ra để loại bỏ 'field1' và' field2' xảy ra khi chuyển đổi ** một thể hiện của 'B' lớp **? –

+0

Bạn nên đặt các chú thích này trên các trường hoặc phương thức của lớp B. Các trường của sẽ không bị xóa.Chúng sẽ không xuất hiện trong kết quả XML – AlexR

+1

Cảm ơn Alex, nhưng tôi nghĩ đó chính xác là điều tôi không muốn làm (xin xem đoạn cuối của câu hỏi của tôi). Thay đổi này sẽ cấm các trường xuất hiện trong kết quả XML trong ** tất cả các lần xuất hiện ** của lớp B. –

12

Ok, tôi đã đưa ra một số giải pháp hacky:

@XmlRootElement 
public class A { 

    private Long id; 
    private B b; 

    // setters and getters 
} 

tôi đã cung cấp một getter thêm chỉ dành riêng cho các trường hợp sử dụng REST, do đó, nó giống như:

@XMLTransient 
public B getB() { 
    return b; 
} 

@XMLElement(name="b") 
public Long getBForREST() { 
    return b.getId(); 
} 

Nó là kết quả trong cấu trúc sau:

<a> 
    <id>2</id> 
    <b>5</b> 
</a> 

Cấu trúc này không giống với cấu trúc của tôi.

Tôi không thích giải pháp này - một số @XMLExclude({"field1", "field2"}) hoặc thứ gì đó như thế sẽ sạch hơn nhiều theo ý kiến ​​của tôi.

Tuy nhiên - hiện tại, nó hoạt động; nó xấu xí, nhưng nó hoạt động.

+3

Bạn thậm chí có thể làm cho getter REST chỉ riêng tư, vì vậy nó sẽ không gây nhầm lẫn cho người dùng lớp của bạn. –

+0

Nó không phải là xấu xí, hoàn hảo của nó, cảm ơn! –

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