gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:54:24 26 4
gpt4 key购买 nike

我想获取一个对象作为 POST 请求的参数。我得到了一个名为 Promotion 的抽象父类(super class)及其子类 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>

我尝试将其转换为产品(在本例中,字段“标记”和“距离”来自促销类,“priceBefore”来自产品类)我得到一个异常:

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

Percent 似乎被选为“默认”子类。为什么会这样,我怎样才能得到一个 Product 的对象?

最佳答案

由于您拥有具有相同根元素的整个继承层次结构,因此您需要利用 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>

关于java - Jersey,JAXB 并获取一个扩展抽象类的对象作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13198695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com