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