Java JAXB如何将XmlElements重新定义为现有变量

时间:2010-03-03 07:05:20

标签: java jaxb

当使用jaxb进行解组时,我在A类中有一些东西:

public class A {
    @XmlElements( { //
    @XmlElement(name = "g", type = A.class),
        @XmlElement(name = "x", type = X.class), 
        @XmlElement(name = "y", type = Y.class),        
    })
    List<XXX> children;
}

也就是说,我有一个列表,孩子,由X:s和Y:s组成

现在我的问题:我想继承A,我想 重新定义'XmlElements'列表并将其绑定到同一个变量'children', 像:

public class B extends A {
    @XmlElements( { //
    @XmlElement(name = "g", type = B.class),
        @XmlElement(name = "x", type = X.class), 
        @XmlElement(name = "y", type = Y.class), 
        @XmlElement(name = "z", type = Z.class),        
    })
    List<XXX> children;
}

以上问题有两个方面:

  1. 我创建了一个新的变量children,我想引用A类中的变量。

  2. 我想避免重新指定'x'和'y',因为它们已在'A'中指定。

  3. 有没有一些好的模式来实现这个目标?

    或者一些关于如何构建这样的东西的指针/文章或其他信息?

2 个答案:

答案 0 :(得分:1)

没有避免重新声明注释,但是可以将注释从字段移动到getter方法,只要您使用@XmlAccessorType注释来告诉JAXB寻找公共getter方法而不是字段。

因此您可以使用新的注释集覆盖类getChildren()中的B

@XmlAccessorType(PROPERTY)
public class A {
    private List<XXX> children;

    @XmlElements( { //
    @XmlElement(name = "g", type = A.class),
        @XmlElement(name = "x", type = X.class), 
        @XmlElement(name = "y", type = Y.class),        
    })
    public List<XXX> getChildren() {
       return children;
    }

    public void setChildren(List<XXX> children) {
       this.children = children;
    }
}

@XmlAccessorType(PROPERTY)
public class B extends A {
    @XmlElements( { //
    @XmlElement(name = "g", type = B.class),
        @XmlElement(name = "x", type = X.class), 
        @XmlElement(name = "y", type = Y.class), 
        @XmlElement(name = "z", type = Z.class),        
    })
    public List<XXX> getChildren() {
       return super.getChildren();
    }
}

我不确定JAXB将如何处理覆盖getChildren()方法。希望它能从B获取注释,但它可能会被混淆。

试一试,看看。

答案 1 :(得分:1)

当在父级中使用PROPERTY @XmlAccessorType时,JAXB实际上将处理overriden方法,但是在输出xml数据中,JAXB可能还会在根标记属性中另外生成,例如: xsi:type =“ B“和xmlns:xsi =”http://www.w3.org/2001/XMLSchema-instance“,因为我们定义了一个从A继承的新类型B.所以从A类生成的xml将不会与B类生成的相同,因为JAXB正确添加了这两个属性,以通知我们定义了其他类型B.

我希望看到一种方法可以避免输出xml中的 xsi xmlns 信息。 JAXB的这种行为非常好,但对我来说,在我的xml输出中不通知接收器,我已经使类扩展了我可能从客户端xsd模式中获取的原始类。

要从派生的子类生成xml但没有使用JAXB添加的 xsi xmlns 属性,我使用了临时技巧,我试图用更好的东西进行交换:I在子窗口中覆盖了方法,在父覆盖方法中,我不得不使用@XmlElement但是我没有将继承的类类型添加到JAXB.newinstance调用中。