JAXB元素显示SuperClass名称和类名称作为属性

时间:2013-07-08 07:41:09

标签: xml jaxb marshalling hierarchy

我正在尝试使用JAXB在XML中序列化一些对象,当我得到一个字段作为抽象类指针时,我将此代码序列化:

<Message>
    <MessageID>1</MessageID>
    <OperationType>Update</OperationType>
    **<Content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="product">**
        <SKU>skuparent</SKU> ...

但我需要的是:

<Message>
    <MessageID>1</MessageID>
    <OperationType>Update</OperationType>
    **<Product>**
        <SKU>skuparent</SKU>

我无法使用“@XMLTransient”标记对其进行转换,这是我从其他帖子中获得的唯一命题

我的代码是:

@XmlType(propOrder = { "MessageID", "operationType", "Content"})
public static class message{
    public int MessageID;
    private String OperationType;
    @XmlElement(name ="OperationType")
    public String getOperationType() {
        return OperationType;
    }

    public void setOperationType(String _operationType) {
        OperationType = operationType.valueOf(_operationType).toString();
    }

    public AmazonContent Content;
}

“AmazonContent”是这样的抽象类:

@XmlSeeAlso({Product.class})
public abstract class AmazonContent {

}

并且subClass实例是:

@XmlRootElement(name = "Product")
@XmlType(propOrder = { "SKU", "StandardProductID", "DescriptionData", "ProductData"})
public class Product extends AmazonContent {

任何想法?

2 个答案:

答案 0 :(得分:1)

默认情况下,JAXB实现在表示继承时将利用xsi:type属性作为描述符节点:

使用元素名称作为继承指示符对应于可以使用@XmlElementRef注释映射的替换组的XML模式概念。值的元素名称将是引用类的@XmlRootElement注释中指定的名称。

@XmlElementRef
public AmazonContent Content;

了解更多信息:

答案 1 :(得分:0)

由于后来更新了Api,Blaise Doughan可能错过了一个细节,我在这里找到了:

http://old.nabble.com/Re:-XmlElementRef-points-to-a-non-existent-class-p22366506.html

XmlReference应该按如下方式进行参数化

抽象类是有针对性的:

public static class productData{
    @XmlElementRefs({
        @XmlElementRef(type = Shoes.class),
        @XmlElementRef(type = Clothing.class)
    })
    public AmazonProductData Product; //Abstract AmazonProductData
}

这些是SubClasses:

@XmlRootElement(name = "Shoes")
public class Shoes extends AmazonProductData {

@XmlRootElement(name = "Clothing")
public class Clothing extends AmazonProductData {

不需要任何其他内容, @XmlTransient ,也不 @XmlSeeAlso 或其他任何

希望它有所帮助!