Java Jersey、JAXB和获取扩展抽象类作为参数的对象

Java Jersey、JAXB和获取扩展抽象类作为参数的对象,java,rest,service,jaxb,jersey,Java,Rest,Service,Jaxb,Jersey,我想获取一个对象作为POST请求的参数。我得到了一个名为Promotion的抽象超类,以及Product和Percent的子类。以下是我如何尝试获取请求: @POST @Consumes(MediaType.APPLICATION_XML) @Produces(MediaType.APPLICATION_XML) @Path("promotion/") public Promotion createPromotion(Promotion promotion) { Pro

我想获取一个对象作为POST请求的参数。我得到了一个名为
Promotion
的抽象超类,以及
Product
Percent
的子类。以下是我如何尝试获取请求:

@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请求时,其主体如下:


34.5
假的
44
我尝试将其转换为Product(在本例中,'marked'和'distance'字段来自促销类,而'priceBefore'字段来自Product类),我得到一个例外:

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

似乎选择了
Percent
作为“默认”子类。这是为什么?我如何才能得到一个
产品的对象?

因为您的整个继承层次结构都具有相同的根元素,所以需要利用
xsi:type
属性来指定适当的子类型


34.5
假的
44
了解更多信息


更新

另一种尝试是给每个子类型一个不同的
@XmlRootElement

@XmlRootElement//默认为“产品”
公营产品推广{
//身体
}
然后发送以下XML:


34.5
假的
44

您在更新中编写的内容正在运行,我以前也尝试过,但我希望所有子类都被称为“升级”,所以我尝试了您发布的第一个内容。因此,我在帖子正文中添加了:xmlns:xsi=”“xsi:type=“product”,但遗憾的是,我仍然得到了同样的例外。我是否应该在这一行之外添加其他内容?@krajol-当您对
产品的实例执行get操作时,您会得到什么样的响应?然后我会得到例如:
0 0 true 33.0 34.5