Java Jersey、JAXB和获取扩展抽象类作为参数的对象
我想获取一个对象作为POST请求的参数。我得到了一个名为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
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