6

生成された型がインターフェースであるリストであるフィールドの JAXB アノテーションに問題があります。次のように宣言した場合:

@XmlAnyElement
private List<Animal> animals;

すべてが正しく機能します。しかし、次のようなラッパー要素を追加すると:

@XmlElementWrapper
@XmlAnyElement
private List<Animal> animals;

Java オブジェクトは正しくマーシャリングされていますが、マーシャリングによって作成されたドキュメントをアンマーシャリングすると、リストが空になります。この問題を示すために、コードの下に投稿しました。

私は何か間違ったことをしていますか、それともこれはバグですか? バージョン 2.1.12 と 2.2-ea で試してみましたが、同じ結果でした。

ここにある注釈を使用してインターフェイスをマッピングする例を実行しています。 https://jaxb.dev.java.net/guide/Mapping_interfaces.html

@XmlRootElement
class Zoo {

  @XmlElementWrapper
  @XmlAnyElement(lax = true)
  private List<Animal> animals;

  public static void main(String[] args) throws Exception {
    Zoo zoo = new Zoo();
    zoo.animals = new ArrayList<Animal>();
    zoo.animals.add(new Dog());
    zoo.animals.add(new Cat());

    JAXBContext jc = JAXBContext.newInstance(Zoo.class, Dog.class, Cat.class);
    Marshaller marshaller = jc.createMarshaller();

    ByteArrayOutputStream os = new ByteArrayOutputStream();
    marshaller.marshal(zoo, os);

    System.out.println(os.toString());

    Unmarshaller unmarshaller = jc.createUnmarshaller();
    Zoo unmarshalledZoo = (Zoo) unmarshaller.unmarshal(new ByteArrayInputStream(os.toByteArray()));

    if (unmarshalledZoo.animals == null) {
      System.out.println("animals was null");
    } else if (unmarshalledZoo.animals.size() == 2) {
      System.out.println("it worked");
    } else {
      System.out.println("failed!");
    }
  }

  public interface Animal {}

  @XmlRootElement
  public static class Dog implements Animal {}

  @XmlRootElement
  public static class Cat implements Animal {}
} 
4

5 に答える 5

8

@XmlElementRefs({ @XmlElementRef(type=Dog.class), @XmlElementRef(type=Cat.class)}) プライベート リストの動物を使用する必要があります。

または @XmlAnyElement(lax = true) のみを使用し、Dog.class、Cat.class を JaxbContext に追加します

于 2011-02-28T14:49:34.537 に答える
0

jdk1.6.0_20を使用してテストプログラムを実行すると機能しませんが、リストの注釈をからに変更@XmlAnyElement(lax = true)する@XmlElementRefs({ @XmlElementRef(type=Dog.class), @XmlElementRef(type=Cat.class)})と機能します。それは問題ではなくDog.classCat.classJAXBContextに追加されるかどうかは関係ありません。

于 2011-09-12T18:17:28.830 に答える
0

注釈をアクセサリーに入れてみましたか? 私も以前に @XmlElementWrapper でこの問題を抱えていましたが、フィールド宣言に注釈を付ける代わりに、ゲッターに注釈を付けることで解決しました。

于 2010-12-20T02:48:14.190 に答える
0

テスト プログラムを jdk1.6.0_20 で実行すると、動作しているように見え、次の出力が得られます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<zoo><animals><dog/><cat/></animals></zoo>
it worked
于 2010-07-29T13:26:46.117 に答える