2012-11-02 22 views
4

我想获得一个对象作为POST请求的参数。我有一个抽象超类,名为Promotion和子类ProductPercent。以下是我试图让一个请求:泽西岛,JAXB和获取对象作为参数扩展抽象类

@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> 

,我尝试将其转换为产品(在这种情况下,字段“标记”和“距离”是从推广类和“priceBefore”是从产品类)我得到一个异常:

java.lang.ClassCastException: Percent cannot be cast to Product. 

看起来好像Percent被选为'默认'的子类。为什么是这样的,我怎样才能得到一个Product的物体?

回答

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> 

更多信息


UPDATE

另一件事,试图将是给每个亚型不同@XmlRootElement

@XmlRootElement // defaults to "product" 
public class Product extends Promotion { 
    //body 
} 

,然后把下面的XML:

<product> 
    <priceBefore>34.5</priceBefore> 
    <marked>false</marked> 
    <distance>44</distance> 
</product> 
+0

您在更新写什么是工作,我以前尝试过,但我想所有子类被称为“促销'所以我尝试了你发布的第一件事。所以我补充说: xmlns:xsi =“http://www.w3.org/2001/XMLSchema-instance”xsi:type =“product” 我的POST正文,但遗憾的是我仍然得到相同的异常。我应该在旁边添加一些其他的东西吗? – krajol

+0

@krajol - 当你对'Product'的一个实例进行get操作时,你会得到什么回应? –

+0

然后我得到例如: '<?XML版本= “1.0” 编码= “UTF-8” 独立= “是”> 33.0 34.5 ' – krajol