JAXBを使用したアンマーシャリング

私はjava(C#.netバックグラウンドから来て)には新しく、上記の例をマーシャリングとアンマーシャリングにしようとしていました。

Following the link below Marshalling a List of objects implementing a common interface, with JaxB

Mr.Blaise Doughanが述べたような上記の手法を使って、私はJavaオブジェクトをXMLにマーシャリングすることができました。しかし、私はこのxmlを保存し、javaオブジェクトに戻すxmlをアンマーシャリングしようとすると、コンソール上で次のようになります:

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:2   IllegalAnnotationExceptionsの数   @ javax.xml.bind.annotation.XmlElementRef注釈は2つで見つかる   場所; 1つは十分です。この問題は以下に関連しています   location:@ javax.xml.bind.annotation.XmlElementRef(name = ## default、   required = true、type = class   公開時にjavax.xml.bind.annotation.XmlElementRef $ DEFAULT、namespace =)   コミュニティのjava.util.List Community.getPeople()この問題は   次の場所に関連する:at   @ javax.xml.bind.annotation.XmlElementRef(name = ## default、   required = true、type = class   公開時にjavax.xml.bind.annotation.XmlElementRef $ DEFAULT、namespace =)   コミュニティのvoid Community.setPeople(java.util.List)....

注:私はアンマーシャリングを実装するためのClass BoyとClass Girlのためのgetters/setterを作成しました。

1
「公式」の例を見てください: docs.oracle.com/ javaee/5/tutorial/doc/bnbah.html
追加された 著者 Kai,

2 答え

getPeopleメソッドとsetPeopleメソッドの両方に注釈が付いているようです。 JAXB(およびその他のJava EE技術)では、注釈を付けるだけです。

public class Community {

    private List people;

    @XmlElementRef
    public List getPeople() {
        return people;
    }

    public void setPeople(List people) {
        this.people = people;
    } 

}

詳細情報

3
追加された
こんにちはMr.Blaise Doughanコードは以下の通りです:これはリファレンスリンクで見たものとほぼ同じです: stackoverflow.com/questions/4144296/… 現在、アンマーシャリングを行っています... JAXBContext jaxbContext = JAXBContext .newInstance(Community.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();コミュニティa =(コミュニティ)unmarshaller.unmarshal(新しいファイル( "FILE XMLのパス")); そして、私はgetPeopleメソッドとsetPeopleメソッドの両方にアノテーションを付けました。
追加された 著者 jatin mistry,
こんにちは、あなたはその場にいた... !! PersonクラスUnmarshallingコードのためのsetterではなく、getterのためにだけ注釈を保持した後は、すべてがスムーズに機能しました。 - JAXBContext jaxbContext = JAXBContext.newInstance(Community.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();コミュニティa =(コミュニティ)unmarshaller.unmarshal(新しいファイル( "XMLFilePath"));リスト lstPeople = a.getPeople(); Iterator objIterator = lstPeople.iterator(); while(objIterator.hasNext()){Person objPerson = objIterator.next(); System.out.println(objPerson.getName(‌)); }
追加された 著者 jatin mistry,
何が間違っていたかをバックトラックする...コンソールの出力は何が間違っていたのかの手がかりを与えた...しかし、私はJavaに新しいので、コンパイラのヒントを理解することができませんでした...助けを感謝@ブレイズDoughan。あなたのコメントを回答としてマークする...! - ヤチン
追加された 著者 jatin mistry,

あなたのコードを見せたら、助けが簡単です...

問題は、gettersとsetterがあり、JAXBを混乱させていると思われます。なぜなら、XMLを非整列化するためにそれらを使用する方法を知らないからです。

FIELD アクセスタイプを使用してみてください:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Blubb", namespace=ServiceConstants.XML_NAMESPACE)
public class Blubb implements Serializable {

    @XmlElement(name="Bla", namespace=ServiceConstants.XML_NAMESPACE)
    private Bla bla;

    public Blubb() {

    }

    public void setBla(Bla bla) { this.bla = bla; }

    public Bla getBla() { return this.bla; }
}
0
追加された
こんにちは@hageコードは次のとおりです:これは私が参照リンクで見たものとほぼ同じです:stackoverflow.com/questions/4144296/...しかし、現在はアンマーシャリングしています... JAXBContext jaxbContext = JAXBContext.newInstance(Community 。クラス); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();コミュニティa =(コミュニティ)unmarshaller.unmarshal(新しいファイル( "FILE XMLのパス")); そして、私はgetPeopleとsetPeopleメソッドの両方にアノテーションを付けました
追加された 著者 jatin mistry,