Java 如何在JAXB中省略一个类,但包含它的所有字段?
以下模型:Java 如何在JAXB中省略一个类,但包含它的所有字段?,java,jaxb,Java,Jaxb,以下模型: public class SomeType { @XmlAttribute private int att1 = 4; @XmlElement private Delegate delegate = new Delegate(); public static class Delegate { @XmlAttribute private String att2 = "hi"; @Xml
public class SomeType
{
@XmlAttribute
private int att1 = 4;
@XmlElement
private Delegate delegate = new Delegate();
public static class Delegate
{
@XmlAttribute
private String att2 = "hi";
@XmlAttribute
private String att3 = "howdy";
}
}
生成此输出:
<someType att1="4">
<delegate att2="hi" att3="howdy"/>
</someType>
不确定这是否可能。但是,如果您不必在其他地方使用委托,并且只在这个类中使用委托,那么您可以使用下面的解决方法 在如下所示的所需结构中创建一个中间类,该类将从原始类中读取字段,您可以使用该类解组数据 中间类:通过读取原始类中的字段来填充此类中的字段
public class IntermediateType
{
@XmlAttribute
private int att1 = 4;
@XmlAttribute
private String att2 = "hi";
@XmlAttribute
private String att3 = "howdy";
@XmlElement
private Delegate delegate = new Delegate();
}
简短回答 我不知道,也许真的有一些注释组合,或者能够定义一些自定义适配器/转换器,尽管可能性很小。JAXB应该能够将xml内容表示为Java对象,因此对象图必须与其表示的xml的“布局”匹配 另外,我假设您考虑了继承,您可以从委托扩展类(您可能会将其命名为
BaseSomething
或AbstractSomething
),并且一切都可以工作,但是您失去了扩展其他类的能力
长答案
如果可以,应将xml更改为“不需要的”格式:
<someType att1="4">
<delegate att2="hi" att3="howdy"/>
</someType>
我的观点是,如果您需要适应结构不太好的xml,那么恐怕您将无法避免复制粘贴JAXB注释代码。定义一个xsd模式并从中生成类有时可以减少繁琐的工作 这不行,动机是在几个XmlTypes中包含委托类型,避免反复定义所有公共属性。Ok。我明白了。那就是一些问题。投票表决这个问题
<someType att1="4">
<delegate att2="hi" att3="howdy"/>
</someType>
public class SomeType {
@XmlAttribute
private int att1 = 4;
@XmlAttribute
private String att2 = "hi";
@XmlAttribute
private String att3 = "howdy";
public void setDelegate(Delegate delegate) {
this.att2 = delegate.att2;
this.att3 = delegate.att3;
}
public Delegate getDelegate() {
return new Delegate(att2, att3);
}
public static class Delegate {
private String att2 = "hi";
private String att3 = "howdy";
public Delegate(String att2, String att3) {
this.att2 = att2;
this.att3 = att3;
}
}
}