5

マシャリング プロセス中に JAXB にラッパー クラスを無視させようとしています。すべての関連情報を一緒に保持するため、このラッパー クラスをコードに含めることは理にかなっていますが、マーシャリング プロセス中にそれを取り除く必要があります。以下は該当するコードです。

@XmlType(name = "root")
@XmlRootElement(name = "root")
public class Root {

    @XmlElementRef
    private List<Resource> resources = new ArrayList<>();

    public void addResource(Resource resource) {
        resources.add(resource);
    }
}


@XmlRootElement(name = "", namespace = "")
@XmlAccessorType(XmlAccessType.NONE)
public class Resource {

    @XmlElementRef
    private Element element;
    @XmlElementRef
    private FieldType fieldType;
    @XmlElementRef
    private ListType listType;
}

ルートはメイン オブジェクトであり、リソースはノードを作成したくないラッパー オブジェクトです。ただし、リソース内の Element、FieldType、および ListType をレンダリングする必要があります。

これは私が現在持っているものです:

<root>
    <>
        <element name="resource1"/>
        <fieldType name="resource1--type">
        </fieldType>
        <listType name="resource--list">
        </listType>
    </>
    <>
        <element name="resource2"/>
        <fieldType name="resource2--type">
        </fieldType>
        <listType name="resource2--list">
        </listType>
    </>
</root>

私が達成したいことは次のとおりです。

<root>
    <element name="resource1"/>
    <fieldType name="resource1--type">
    </fieldType>
    <listType name="resource--list">
    </listType>
    <element name="resource2"/>
    <fieldType name="resource2--type">
    </fieldType>
    <listType name="resource2--list">
    </listType>
</root>

それが可能かどうかはわかりませんが、助けていただければ幸いです。

ありがとう。

4

3 に答える 3

5

JAXBではそれを達成することはできません。たとえばXmlAdapterを使用して、このようにシリアル化できたとしても、逆シリアル化することはできません。

これを試して:

@XmlType(name = "root")
@XmlRootElement(name = "root")
@XmlAccessorType(XmlAccessType.NONE)
public class Root {

    private ArrayList<Resource> resources = new ArrayList<Resource>();

    public void addResource(Resource resource) {
        resources.add(resource);
    }

    @XmlElementRefs(value = { @XmlElementRef(type = Element.class),
                              @XmlElementRef(type = ListType.class),
                              @XmlElementRef(type = FieldType.class) })
    public List<Object> getResourceFields() {
        List<Object> list = new ArrayList<Object>();
        for (Resource r : resources) {
            list.add(r.getElement());
            list.add(r.getFieldType());
            list.add(r.getListType());
        }
        return list;
    }
}

基本的getRerourceFieldsに、同じリスト内のすべてのリソースのフィールドを連結します。Rootクラスを変更できない場合は、これがあなたRootAdapterのものであり、@Bijuが提案したように使用できます。

于 2012-06-07T12:09:05.167 に答える
2

おそらく、ルート クラスの XmlAdapter を作成する必要があります。このアダプターは基本的に、ルート インスタンスを別の型にマップする必要があります。そこでは、マーシャリングの前にルート構造をフラット化できます。次の行に沿って:

public class CustomRootAdapter extends
                    XmlAdapter<CustomRoot,Root>> {
@Override
public Root unmarshal(CustomRoot v) throws Exception {
    return null;//if you are not keen on unmarshalling..
}
@Override
public CustomRoot marshal(Root v) throws Exception {
    return ...;
}    

}

このカスタム アダプターは、次を使用して登録できます。

@XmlJavaTypeAdapter(CustomRootAdapter.class)あなたのRootクラスで

于 2012-06-07T13:17:23.667 に答える
-1

それはまさに何のように聞こえ@XMLTransientます。

クラスに配置すると、そのクラスを単独で XML にマップしてはならないことを示します。そのようなクラスのプロパティは、クラスがインライン化されているかのように、その派生クラスと共に XML にマップされます。

javadocを参照

于 2012-06-07T11:10:49.167 に答える