我想将一个对象作为POST请求的参数。我得到了一个名为Promotion
和子类Product
和Percent
的抽象超类。以下是我尝试获取请求的方式:
@POST
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
@Path("promotion/")
public Promotion createPromotion(Promotion promotion) {
Product p = (Product) promotion;
System.out.println(p.getPriceAfter());
return promotion;
}
以下是我在类定义中使用JAXB的方法:
@XmlRootElement(name="promotion")
@XmlSeeAlso({Product.class,Percent.class})
public abstract class Promotion {
//body
}
@XmlRootElement(name="promotion")
public class Product extends Promotion {
//body
}
@XmlRootElement(name="promotion")
public class Percent extends Promotion {
//body
}
所以现在的问题是当我发送一个带有这样的主体的POST请求时:
<promotion>
<priceBefore>34.5</priceBefore>
<marked>false</marked>
<distance>44</distance>
</promotion>
我尝试将其投射到Product(在这种情况下,字段'标记'和'距离'来自Promotion类,'priceBefore'来自Product类)我得到一个异常:
java.lang.ClassCastException: Percent cannot be cast to Product.
似乎Percent
被选为'默认'子类。为什么这样,我怎样才能得到一个Product
的对象?
答案 0 :(得分:0)
由于您的整个继承层次结构具有相同的根元素,因此您需要利用xsi:type
属性来指定相应的子类型。
<promotion xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="product">
<priceBefore>34.5</priceBefore>
<marked>false</marked>
<distance>44</distance>
</promotion>
了解更多信息
<强>更新强>
尝试的另一件事是给每个子类型一个不同的@XmlRootElement
@XmlRootElement // defaults to "product"
public class Product extends Promotion {
//body
}
然后发送以下XML:
<product>
<priceBefore>34.5</priceBefore>
<marked>false</marked>
<distance>44</distance>
</product>