4

我想获取一个对象作为 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

4

1 回答 1

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>
于 2012-11-02T16:51:03.807 回答