Jersey,JAXB并获取一个扩展抽象类作为参数的对象

时间:2012-11-02 15:50:55

标签: java rest service jaxb jersey

我想将一个对象作为POST请求的参数。我得到了一个名为Promotion和子类ProductPercent的抽象超类。以下是我尝试获取请求的方式:

@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的对象?

1 个答案:

答案 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>