我想在jaxb中隐藏派生类中的字段

时间:2017-01-05 10:43:43

标签: java jaxb

我有一个父类,

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

和一个儿童班,

Class B extends A {

  @XmlTransient
  public String getName() {
     return name
  }

当对象B被序列化时,这不会隐藏属性名称。

知道如何使这项工作吗?

由于

1 个答案:

答案 0 :(得分: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)

A Class

@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;
}