2017-01-05 9 views
3

У меня есть родительский класс,Я хочу, чтобы скрыть поле в производном классе в JAXB

Class A { 
    @XmlElement(required = true) 
    protected String name; 
} 

и класс ребенка,

Class B extends A { 

    @XmlTransient 
    public String getName() { 
    return name 
    } 

Это не скрывает имя свойства, когда объект B сериализуется.

Любая идея, как сделать эту работу?

Благодаря

+1

Как имя будет _required_ для класса 'Ā', но не для класса' 'b' когда B' является подклассом' Ā'? – RudolphEst

ответ

1

JAXB не позволяет отменить связывание определяется в родительских элементов в классе детей.
Чтобы достичь этого, я могу предложить использовать промежуточный класс, который должен содержать все, что на самом деле содержится в вашем классе A, но вы должны аннотировать его XmlTransient и не указывать в нем никакого отображения.
Оба класса A и класс B должны расширять этот базовый класс, но теперь каждый может определить, как определить их привязку JAXB.

Вот пример, начинающийся с вашего кода.

Базовый класс

@XmlTransient 
public class Base { 

    protected String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

A класс может использовать поведение JAXB по умолчанию, если он подходит. Он создаст сопоставление с общедоступными полями и общедоступным getter/setter (поэтому наследуется от родительского класса).

По умолчанию, если @XmlAccessorType на упаковке отсутствует, то уровень аннотаций следующий пакет предполагается.

@XmlAccessorType (XmlAccessType.PUBLIC_MEMBER)

Класс

@XmlRootElement 
public class A extends Base { 
} 

Если вы хотите, чтобы указать атрибут, как required или использовать какие-либо особенности в отображении элементов, вы должны использовать явное связывание в классе A.

Но класс B должен указать @XmlAccessorType(XmlAccessType.NONE), чтобы иметь полный контроль над полями для сериализации/десериализации из класса Base.

B Класс

@XmlRootElement 
@XmlAccessorType(XmlAccessType.NONE) 
public class B extends Base { 
    @XmlElement 
    private String boundedStringSpecificToB; 
}