2013-12-13 2 views
5

Moxyに継承されたオブジェクトのリストのXMLとJSONを生成させるのに問題があります。 XMLの外観が見えるかJSONがうまく見えますが、同時には見えません。Moxy:オブジェクトのリストXMLとJSONの両方がうまく見えません

public static abstract class Animal { 
    private String name; 

    protected Animal() { 
    } 
    protected Animal(String name) { 
     this.name = name; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 
@XmlRootElement 
public static class Tiger extends Animal { 
    public Tiger() { 
    } 
    public Tiger(String name) { 
     super(name); 
    } 
} 

@XmlRootElement 
public static class Lion extends Animal { 
    public Lion() { 
    } 
    public Lion(String name) { 
     super(name); 
    } 
} 

@XmlRootElement 
public static class Zoo { 
    private List<Animal> animals = new ArrayList<>(); 

    @XmlElementRef 
    public List<Animal> getAnimals() { 
     return animals; 
    } 
    public void setAnimals(List<Animal> animals) { 
     this.animals = animals; 
    } 
    public void addAnimal(Animal a) { 
     animals.add(a); 
    } 
} 

は、以下の動物園インスタンス

zoo = new Zoo(); 
    zoo.addAnimal(new Tiger("Hobbes")); 
    zoo.addAnimal(new Lion("Simba")); 
    zoo.addAnimal(new Tiger("Sherikan")); 

ルックなどから生成されたXMLとJSON::ここではモデルです

<?xml version="1.0" encoding="UTF-8"?> 
    <zoo> 
    <tiger> 
     <name>Hobbes</name> 
    </tiger> 
    <lion> 
     <name>Simba</name> 
    </lion> 
    <tiger> 
     <name>Sherikan</name> 
    </tiger> 
    </zoo> 
    { 
    "zoo" : { 
     "tiger" : [ { 
      "name" : "Hobbes" 
     }, { 
      "name" : "Sherikan" 
     } ], 
     "lion" : [ { 
      "name" : "Simba" 
     } ] 
    } 
    } 

XMLは、私もそれを望むものを正確に見えますが、しかし、 JSONは奇妙です。 Moxyが型をキーとして使用する方法は、リスト内の要素の間で順序を保持しません。これはバグですか、機能ですか?

の注釈を@XmlElementに変更した場合、JSON出力は正常ですが、XML出力は使用できないものに変更されています。

{ 
    "zoo" : { 
     "animals" : [ { 
      "type" : "tiger", 
      "name" : "Hobbes" 
     }, { 
      "type" : "lion", 
      "name" : "Simba" 
     }, { 
      "type" : "tiger", 
      "name" : "Sherikan" 
     } ] 
    } 
    } 
    <?xml version="1.0" encoding="UTF-8"?> 
    <zoo> 
    <animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="tiger"> 
     <name>Hobbes</name> 
    </animals> 
    <animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="lion"> 
     <name>Simba</name> 
    </animals> 
    <animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="tiger"> 
     <name>Sherikan</name> 
    </animals> 
    </zoo> 

私はこの問題を解決するために作ってみた唯一の方法はZoo.animalsに注釈を上書きする外部OXMバインディングファイルを作成することです。以下のバインディングは、JAXBContextProperties.OXM_METADATA_SOURCEのプロパティを使用して登録されます。

<?xml version="1.0"?> 
    <xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xml-accessor-type="PUBLIC_MEMBER" xml-accessor-order="ALPHABETICAL" 
       xml-mapping-metadata-complete="false" 
       package-name="com.example"> 
    <java-types> 
     <java-type name="com.example.JAXBTest2$Zoo"> 
      <java-attributes> 
       <xml-element java-attribute="animals"/> 
      </java-attributes> 
     </java-type> 
    </java-types> 
    </xml-bindings> 

これには外部バインディングファイルを使用しない方が良い解決策がありますか?

答えて

2

注:私はEclipseLink JAXB (MOXy)リードだとJAXB (JSR-222)専門家グループ

のメンバーMOXYをキーとしてタイプを使用する方法は、リスト内の要素間の順序 が保持されません。これはバグですか、機能ですか?

キーを繰り返さないようにしました。

私はこの問題を解決するために作ってみた唯一の方法は、Zoo.animals上の注釈を上書きするために、外部 OXMバインディングファイルを作成することです。下記の バインディングは、 JAXBContextProperties.OXM_METADATA_SOURCEのプロパティを使用して登録されています。

これは私のユースケースの解決方法です。

+0

Blaise、あなたの迅速な対応に感謝します。実際のオブジェクトの合成型のプロパティではなく、jsonキーに型情報を格納する理由を知っていますか? – user3099799