4

POST リクエストのパラメータとしてオブジェクトを取得したい。PromotionサブクラスProductand と呼ばれる抽象スーパークラスを取得しました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 リクエストを送信するときです。

<promotion>
  <priceBefore>34.5</priceBefore>
  <marked>false</marked>
  <distance>44</distance>
</promotion>

そして、それを Product にキャストしようとしました (この場合、フィールド 'marked' と 'distance' は 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 に答える