【问题标题】:Ignore a parent class when Serializing to XML序列化为 XML 时忽略父类
【发布时间】:2011-04-13 07:15:47
【问题描述】:

当您在子类列表中有 @XmlElement 时,是否有 JAXB 注释来忽略父类?

澄清一下 - 我想知道是否有比将所有父类 getter/setter 标记为瞬态,然后必须返回子类并添加 getter/setter 并将它们注释为 XmlElements 更好的方法不错

一个例子:

public class GenericHelper {
    String name="";
    String dates="";
    String roleName="";
    String loe="";
    @XmlTransient
    public String getName() {return name;}
public void setName(String name) {this.name = name;}
@XmlTransient
public String getDates() {return dates;}
public void setDates(String dates) {this.dates = dates;}
@XmlTransient
public String getRoleName() {return roleName;}
public void setRoleName(String roleName) {this.roleName = roleName;}
@XmlTransient
public String getLOE() {return loe;}
public void setLOE(String loe) {
    this.loe = loe.replace("%", "").trim();
}
}

public class SpecificHelper extends GenericHelper {
List<ProjectHelper> projects;
public SpecificHelper (){
    projects=new ArrayList<ProjectHelper>();
}
@XmlElement(name = "project")
@XmlElementWrapper (name = "projectlist")
public List<ProjectHelper> getProjects() {return projects;}
public void setProjects(List<ProjectHelper> projects) {this.projects = projects;}
@XmlElement
public String getName(){
    return super.getName();
}

@Override
public String toString(){
    String ret="SpecificHelper [";
    ret+="name:"+name+";";
    ret+="dates:"+dates+";";
    ret+="roleName:"+roleName+";";
    ret+="loe:"+loe+";";
    ret+="\n\tprojects:"+projects+";";
    return ret+"]";
}
}

所以在这个例子中,如果我取出 GenericHelper 中的 XmlTransient 注释,任何扩展它的类,如果我有一个方法 getSpecificHelper() 返回所有雇主的列表,并用 XmlElement 注释它,所有这些项目将返回一个名称、LOE、RoleName 等。我正在寻找一个在 GenericHelper 上进行的类注释,这样我就可以避免必须单独使用所有 @XmlTransients,并且只使用我放入的 XmlElement 符号具体助手

【问题讨论】:

  • 我不确定我是否理解。是否可以发布一个简短的示例来说明您的问题?

标签: java data-binding xml-serialization jaxb


【解决方案1】:

怎么样?

父类

我们将使用 XmlAccessType.NONE 告诉 JAXB 只有显式注释的字段/属性被映射。

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

@XmlAccessorType(XmlAccessType.NONE)
public class Parent {

    private String parentProperty1;
    private String parentProperty2;

    public String getParentProperty1() {
        return parentProperty1;
    }

    public void setParentProperty1(String parentProperty1) {
        this.parentProperty1 = parentProperty1;
    }

    public String getParentProperty2() {
        return parentProperty2;
    }

    public void setParentProperty2(String parentProperty2) {
        this.parentProperty2 = parentProperty2;
    }

}

子类

我们将对孩子使用 XmlAccessType.PROPERTY。我们想要包含的父类的任何属性都需要被覆盖并显式注释。在此示例中,我们将从 Parent 类中引入 parentProperty2。您只需要覆盖父类中的 getter。

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Child extends Parent {

    private String childProperty;

    @Override
    @XmlElement
    public String getParentProperty2() {
        return super.getParentProperty2();
    }

    public String getChildProperty() {
        return childProperty;
    }

    public void setChildProperty(String childProperty) {
        this.childProperty = childProperty;
    }

}

演示类

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Child.class);

        Child child = new Child();
        child.setParentProperty1("parentProperty1");
        child.setParentProperty2("parentProperty2");
        child.setChildProperty("childProperty");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(child, System.out);
    }
}

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<child>
    <childProperty>childProperty</childProperty>
    <parentProperty2>parentProperty2</parentProperty2>
</child>

【讨论】:

  • 我没有完全按照你在这里说的去做,但是很接近。感谢您的提示!
  • 父类在第三方库中,不能修改源代码?
  • @CaiNiaoCoder - 如果您使用 EclipseLink MOXy 作为您的 JAXB 提供程序,那么您可以为该用例使用外部映射文档:blog.bdoughan.com/2010/12/…
  • @Doughan 嘿伙计,我只想再次感谢你,我几乎在每个与 JAXB 相关的问题中都看到了你。
  • @BlaiseDoughan,有没有办法在不修改基类的情况下实现这一点?当基类属于其他项目/模块时可能很重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多