我正在尝试使用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 {
任何想法?
答案 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 或其他任何
希望它有所帮助!