1

私はやることに使ってjava jaxb2.0います。 このような問題に遭遇しました。 サンプル xml は次のようになります* (fruit.xml) *:xml marshallingunmarshalling

<fruitPacks>
  <fruit name="apple1" type="apple" isApple="true"/>
  <fruit name="banana1" type="banana" isBanana="true"/>
  <fruit name="apple2" type="apple" isApple="true"/>
</fruitPacks>

そして、次のようなJavaクラス:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "fruitPacks")
@XmlRootElement
public class FruitPacks
{
   @XmlElement(name = "fruit")
   private List<Fruit> fruits
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "fruit")
@XmlSeeAlso({ Apple.class, Banana.class })
public class Fruit{
 @XmlAttribute
 private String name;
 @XmlAttribute
 private String type;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "apple")
public class Apple extends Fruit{
  @XmlAttribute
  private boolean isApple = true;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "banana")
public class Banana extends Fruit{
  @XmlAttribute
  private boolean isBanana = true;
}

非整列化コードは次のとおりです。

public class JAXBTest {

public static void main(String [] args) throws Exception{
    JAXBContext jc = JAXBContext.newInstance(FruitPacks.class,Fruit.class,Apple.class, Banana.class);

    Unmarshaller unmarshaller = jc.createUnmarshaller();
    Object obj = unmarshaller.unmarshal(new File("fruit.xml"));
    System.out.println(obj);
}   
}

だから私がやりたいことは:
xml をアンマーシャリングするとき、フルーツの構築は type 属性に基づいてサブクラス (Apple、Banana) に対して自動的に行われます。
どうすればできますか?

4

2 に答える 2

2

JAXBContextサブクラスを認識していることを確認する必要があります。これを行う 1 つの方法は、@XmlSeeAlso注釈を使用することです。以下の例を参照してください。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "fruit")
@XmlSeeAlso({Apple.class, Banana.class})
public class Fruit{
 @XmlAttribute
 private String name;
 @XmlAttribute
 private String type;
}

詳細については


アップデート

type標準属性ではなく属性を使用していることに気付きましたxsi:type。どの JAXB 実装でも、以下を活用してこのユース ケースをマッピングできますXmlAdapter

EclipseLink JAXB (MOXy) を使用している場合は、@XmlDescriminatorNode/@XmlDescriminatorValue拡張子を利用できます。

于 2012-05-15T10:25:53.410 に答える