2012-11-02 64 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