有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有家长课

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

还有一个儿童班

Class B extends A {

  @XmlTransient
  public String getName() {
     return name
  }

这并不是在序列化对象B时隐藏属性名

你知道怎么做吗

谢谢


共 (1) 个答案

  1. # 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的映射(因此可以从父类继承)

    By default, if @XmlAccessorType on a package is absent, then the following package level annotation is assumed.

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