2

Eclipselink/MOXy 2.3 を使用すると、XML へのマーシャリングで次のユースケースがあります。

abstract class MyAbstract {
}

class MyImpl extends MyAbstract {
}

class A {

    private MyAbstract myAbstract;

    // MyImpl is behind this
    public MyAbstract getMyAbstract() {
        return myAbstract;
    }

}

oxm.xml で次のマッピングが定義されています。

<java-type name="foo.MyAbstract" xml-accessor-type="NONE">
    <xml-see-also>
        foo.MyImpl
    </xml-see-also>
</java-type>

<java-type name="foo.MyImpl">
    <xml-root-element name="MyImpl" />
</java-type>

<java-type name="bar.A" xml-accessor-type="NONE">
    <xml-root-element name="A" />
    <java-attributes>
        <xml-element java-attribute="myAbstract" type="foo.MyAbstract" />
    </java-attributes>
</java-type>

これにより、次の結果が得られます。

<A>
    <myAbstract xsi:type="myImpl">
        <!-- Mapped members of MyImpl + MyAbstract -->
    </myAbstract>
</A>

エクスポートされたxmlにプロパティ名が必要なかったので、変更しました:

<java-type name="bar.A" xml-accessor-type="NONE">
    <xml-root-element name="A" />
    <java-attributes>
        <xml-element java-attribute="myAbstract" type="foo.MyAbstract" xml-path="."/>
    </java-attributes>
</java-type>

その結果:

<A>
    <!-- Members of MyImpl + MyAbstract marshalled without any wrapping element-->
</A>

私が欲しいのは:

 <A>
    <MyImpl>
        <!-- Members of MyImpl + MyAbstract -->
    </MyImpl>
 </A>

問題は次のとおりです。どうすればこれを達成できますか? MOXy は MyImpl の XmlRootElement を無視しています...

編集:

Blaiseが提案したことを試すと、次の例外が発生します。

Exception [EclipseLink-60] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):   
org.eclipse.persistence.exceptions.DescriptorException
The method [] or [getMyAbstract] is not defined in the object [bar.A].

これには、関連性がないと思ったために以前に省略した追加情報が必要です。

クラス A は次を定義するインターフェイスです: public X getMyAbstract(); MyAbstract は X を実装します (これが、インターフェイス A のマッピングに型属性を追加した理由です)。

したがって、xml-element-refMOXy を使用してもゲッターは「見えません」xml-element

4

1 に答える 1

2

お探しのマッピングは です@XmlElementRef。これは、XML スキーマの置換グループの概念に対応しています。

バー/oxm.xml

bar以下は、パッケージの外部マッピング ドキュメントです。xml-element-refの XML 表現であるmyAbstract プロパティがどのようにマップされるかに注意してください。@XmlElementRef

<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="bar">
    <java-types>
        <java-type name="A" xml-accessor-type="NONE">
            <xml-root-element name="A" />
            <java-attributes>
                <xml-element-ref java-attribute="myAbstract"/>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

foo/oxm.xml

foo以下は、パッケージの外部メタデータ ファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="foo">
    <java-types>
        <java-type name="MyAbstract" xml-accessor-type="NONE">
            <xml-see-also>
                foo.MyImpl
            </xml-see-also>
        </java-type>
        <java-type name="MyImpl">
            <xml-root-element name="MyImpl" />
        </java-type>
    </java-types>
</xml-bindings>

デモ

以下は、この例のデモ コードです。

package forum8853855;

import java.util.*;
import javax.xml.bind.*;    
import org.eclipse.persistence.jaxb.JAXBContextFactory;
import bar.A;
import foo.MyImpl;

public class Demo {

    public static void main(String[] args) throws Exception {
        List<String> oxm = new ArrayList<String>(2);
        oxm.add("foo/oxm.xml");
        oxm.add("bar/oxm.xml");

        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, oxm);

        JAXBContext jc = JAXBContext.newInstance(new Class[] {A.class}, properties);
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        A a = new A();
        a.setMyAbstract(new MyImpl());
        marshaller.marshal(a, System.out);
    }

}

出力

<?xml version="1.0" encoding="UTF-8"?>
<A>
   <MyImpl/>
</A>

詳細については

于 2012-01-13T20:14:02.143 に答える