2

私はこの問題を理解するために一日を費やしましたが(このサイトでの広範な検索を含む)、私の問題に対する答えを見つけることができません。私はこれを達成しようとしています:

  • XMLと私が制御できないいくつかの既存のJavaオブジェクトの間で変換する
  • 結果/ソースXMLの要素の名前は、Javaクラスのプロパティの名前とは異なります
  • jaxb-2.0に制限されています
  • アノテーションを含めることができるラッピングクラスを導入する場合があります

私が達成しようとしていることの例をお見せしましょう。私が制御できないJavaクラスは次のようになっていると仮定しましょう。

public class TopNoControlClass {

    private BottomNoControlClass bottomNoControlObject;

    public TopNoControlClass(BottomNoControlClass bottomNoControlObject) {
        super();
        this.bottomNoControlObject = bottomNoControlObject;
    }

    public BottomNoControlClass getBottomNoControlObject() {
        return bottomNoControlObject;
    }
    public void setBottomNoControlObject(BottomNoControlClass bottomNoControlObject) {
        this.bottomNoControlObject = bottomNoControlObject;
    }
}

そして、参照されるクラス:

public class BottomNoControlClass {

    private String foo;

    public BottomNoControlClass(String foo) {
        super();
        this.foo = foo;
    }

    public String getFoo() {
        return foo;
    }
    public void setFoo(String foo) {
        this.foo = foo;
    }
}

そして、私がこれをマーシャリングから取り除きたいと想像してください:

<?xml version="1.0" encoding="UTF-8"?>
<Top>
    <Bottom>
        <bar>XXX</bar>
    </Bottom>
</Top>

<Top>TopNoControlClassにマップされ、< Bottom> BottomはBottomNoControlClassにマップされ、<bar>はBottomNoControlClassのfooプロパティにマップされます。

上記を行うために、マッピングを記述する外部XMLバインディングを作成することに慣れていますが、実行時にその外部バインディングファイルを使用する方法を理解することはできません。これまでに見たすべての例では、生成時に(つまり、xjcへのパラメーターとして)外部XMLバインディングのみを使用していました。

また、参照するクラス(つまり、 TopNoControlClassBottomNoControlClass )のクラス名とクラスプロパティ名をオーバーライドするラッパークラスを導入しても問題はありません。そのクラスを使用してJAXBContextを構築し、残りをJAXBに任せるのは簡単です。しかし、その注釈がどのように見えるべきか理解できません。

どんな助けでも大歓迎です

ジャロスラフ

4

1 に答える 1

0

注: 私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB(JSR-222)エキスパートグループのメンバーです。

JAXB 2(JSR-222)のMOXy実装では、まさにこのユースケースの外部マッピングドキュメントを提供します。

外部メタデータ(oxm.xml)

以下は、ユースケースのマッピングドキュメントがどのようになるかを示しています。この例では、モデルクラスを。というパッケージに入れますforum13318677。詳細については、http://blog.bdoughan.com/2010/12/extending-jaxb-representing-annotations.htmlを参照してください。

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum13318677">
    <java-types>
        <java-type name="TopNoControlClass">
            <xml-root-element name="Top"/>
            <xml-type factory-class="forum13318677.Factory" factory-method="createTopNoControlClass"/>
            <java-attributes>
                <xml-element java-attribute="bottomNoControlObject" name="Bottom"/>
            </java-attributes>
        </java-type>
        <java-type name="BottomNoControlClass">
            <xml-type factory-class="forum13318677.Factory" factory-method="createBottomNoControlClass"/>
            <java-attributes>
                <xml-element java-attribute="foo" name="bar"/>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

工場

モデルクラスには引数0のコンストラクタがなかったため、ファクトリクラスを作成する必要がありました(http://blog.bdoughan.com/2011/06/jaxb-and-factory-methods.htmlを参照)。このクラスは、@XmlType注釈のXML表現で構成されました。

package forum13318677;

public class Factory {

    public TopNoControlClass createTopNoControlClass() {
        return new TopNoControlClass(null);
    }

    public BottomNoControlClass createBottomNoControlClass() {
        return new BottomNoControlClass(null);
    }

}

jaxb.properties

MOXyをJAXB(JSR-222)プロバイダーとして指定するには、jaxb.propertiesドメインクラスと同じパッケージで呼び出されるファイルを次のエントリに含める必要があります(http://blog.bdoughan.com/2011/05/specifying-を参照)。 eclipselink-moxy-as-your.html)。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

デモ

以下のデモコードは、MOXyの外部マッピングドキュメントを活用する方法を示しています。MOXyがJAXBプロバイダーとして使用されている場合でも、MOXyに対するコンパイル時の依存関係はないことに注意してください。

package forum13318677;

import java.io.File;
import java.util.*;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String,Object>();
        properties.put("eclipselink.oxm.metadata-source", "forum13318677/oxm.xml");
        JAXBContext jc = JAXBContext.newInstance(new Class[] {TopNoControlClass.class}, properties);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum13318677/input.xml");
        TopNoControlClass object = (TopNoControlClass) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(object, System.out);
    }

}
于 2012-11-10T11:27:43.080 に答える