2012-10-01 30 views
8

Chúng tôi có một lớp học với chú thích JAXB trên một thuộc tính. Sau đó chúng tôi có một số lớp con, chú thích phần còn lại của dữ liệu quan trọng. Tuy nhiên, chúng ta có một lớp con, nơi chúng ta muốn bỏ qua chú thích lớp cha để nó không bị marshalled. Dưới đây là một số mã ví dụ.Làm thế nào để bỏ qua các thuộc tính được chú thích JAXB trong một lớp cha?

lớp phụ huynh:

@XmlType(name="Request") 
@XmlAccessorType(XmlAccessorType.NONE) 
public abstract class Request { 
    @XmlElement(required=true) 
    private UUID uuid; 

    ... setter/getter 
} 

Bây giờ cho các lớp con:

@Xsd(name="concreteRequest") 
@XmlRootElement("ConcreteRequest") 
@XmlType(name="ConcreteRequest") 
@XmlAccessorType(XmlAccessorType.FIELD) 
public class ConcreteClass { 
    @XmlElement(required=true) 
    private String data1; 
    @XmlElement(required=true) 
    private String data1; 

    ... setters/getters ... 
} 

Khi tôi masrhall một thể hiện của ConcreteClass tôi nhận được XML sau:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ConcreteRequest> 
    <uuid>uuid</uuid> 
    <data1>data</data1> 
    <data2>data</data3> 
</ConcreteRequest> 

Nơi tôi muốn XML như thế này:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ConcreteRequest> 
    <data1>data</data1> 
    <data2>data</data3> 
</ConcreteRequest> 

Chúng tôi có các triển khai Yêu cầu khác, tuy nhiên yêu cầu UUID, đây chỉ là trường hợp đặc biệt. Có cách nào để bỏ qua trường UUID trong ConcreteRequest của tôi không?

Trả lời

6

Tôi hy vọng, tôi đã hiểu sự cố của bạn. Đây là giải pháp.

JAXB cung cấp @XmlTransient(javax.xml.bind.annotation.XmlTransient)(javadoc) để bỏ qua bất kỳ trường nào trong quá trình đầm lầy.

Override lĩnh vực "UUID" như @XmlTransient trong lớp có nguồn gốc của bạn (ConcreteRequest.class) cùng với correspoding Getter/phương pháp Setter của nó. Cần phải ghi đè lên các phương thức Getter/Setter, các phương thức này sẽ được triệu gọi trong quá trình kết hợp.

@Xsd(name="concreteRequest") 
@XmlRootElement("ConcreteRequest") 
@XmlType(name="ConcreteRequest") 
@XmlAccessorType(XmlAccessorType.FIELD) 
public class ConcreteClass { 
    @XmlElement(required=true) 
    private String data1; 
    @XmlElement(required=true) 
    private String data2; 
    @XmlTransient 
    private UUID uuid; 

    ... setters/getters ... 
} 

Điều này sẽ ghi đè thuộc tính Lớp cơ sở của bạn.

Quay lại với tôi để biết thêm thông tin.

+0

Thật không may là tôi không nghĩ điều đó có thể xảy ra trong tình huống của mình. Trường UUID được duy trì trong cơ sở dữ liệu của chúng tôi để ghi đè nó sẽ rất nguy hiểm. Về cơ bản, lớp của tôi là một lớp con đặc biệt, nơi nó có UUID nhưng nó không thuộc về lược đồ XML. – prozaak

+0

Từ phân tích của tôi, JAXB không cung cấp tùy chọn phù hợp với yêu cầu của bạn, Điều tôi đề nghị là sử dụng hành vi JAXB - "Phần tử giá trị Null sẽ bị bỏ qua khi @XmlElement (nillable = false)". Vì vậy, tại thời điểm Marshalling làm cho giá trị "uuid" explicity là null, để nó sẽ không xây dựng tài sản trong Marshalling. Tôi có một đoạn mã mẫu nhưng không thể chia sẻ ở đây. – omega

+0

Điều này không hoạt động. – GoalBased

0

Bạn có thể sử dụng

@XmlAccessorType(XmlAccessType.NONE) 

trên lớp cha mẹ, và

@XmlAccessorType(XmlAccessType.FIELD) 

trên lớp dẫn xuất.

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