1

トリッキーなバグを見つけました:

以下のようにmetadata-xml-bindingを定義すると

<?xml version="1.0"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="package" xml-mapping-metadata-complete="true">
    <xml-schema element-form-default="QUALIFIED" />
    <java-types>
        <java-type name="SearchResult">
            <xml-root-element/>
            <java-attributes>
                <xml-element java-attribute="count"/>
                <xml-element java-attribute="requestParameters"/>
                <xml-element java-attribute="pageSize"/>
                <xml-element java-attribute="sortDirection"/>
                <xml-elements java-attribute="results">
                    <xml-element name="GaDictionaryElement" type="it.ga.model.GaDictionary">
                        <xml-element-wrapper name="GaDictionaryElementWrapper" />
                    </xml-element>
                    <xml-element name="OrganizationUnitElement" type="it.ga.model.OrganizationUnit">
                        <xml-element-wrapper name="OrganizationUnitElementWrapper" />
                    </xml-element>
                    <xml-element name="PersonElement" type="it.ga.model.Person">
                        <xml-element-wrapper name="PersonElementWrapper"  />
                    </xml-element>
                    <xml-element name="Empty" type="java.lang.String">
                        <xml-element-wrapper name="EmptyWrapper" nillable="true"/>
                    </xml-element>
                </xml-elements>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

タグから囲まれたタグに入っているため、<xml-element-wrapper>タグが機能しないことがわかりました。そこで、この問題をクリーンな方法で解決する方法を探していました。クラスの結果が空の場合、空のノードが必要だからです。非常に悪い回避策は、結果用に持っているタイプと同じように多くの異なるバインディング ファイルを作成することですが、私はそれが好きではありません! さらに、誰かが特定のインターフェイスを実装するクラスに役立つ可能性のあるバインディング ファイルを作成しようとしましたか? たとえば、バインディング ファイルで定義されたオブジェクトのプロパティのみを表示し、インターフェイスの名前を型として指定する方法はありますか? 私はこれを見ました: [ブログ]: http://blog.bdoughan.com/2010/07/moxy-jaxb-map-interfaces-to-xml.html#comment-form<xml-element><xml-elements>List<?>List<?>

4

3 に答える 3

2

MOXy が処理する内容に関して、 <xml-element-wrapper>per<xml-element>を内部に持つことは許可されていません。の中に<xml-elements>1 つだけ持つことができます。<xml-element-wrapper<xml-elements>

oxm.xml

<?xml version="1.0"?>
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum16943280" 
    xml-mapping-metadata-complete="true">
    <java-types>
        <java-type name="SearchResult">
            <xml-root-element/>
            <java-attributes>
                <xml-elements java-attribute="results">
                    <xml-element name="GaDictionaryElement" type="forum16943280.GaDictionary"/>
                    <xml-element name="OrganizationUnitElement" type="forum16943280.OrganizationUnit"/>
                    <xml-element-wrapper name="results"/>
                </xml-elements>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

検索結果

package forum16943280;

import java.util.List;

public class SearchResult {

    private List<Object> results;

    public List<Object> getResults() {
        return results;
    }

    public void setResults(List<Object> results) {
        this.results = results;
    }

}

ガディクショナリー

package forum16943280;

public class GaDictionary {

}

組織単位

package forum16943280;

public class OrganizationUnit {

}

デモ

package forum16943280;

import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String , Object>();
        properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum16943280/oxm.xml");
        JAXBContext jc = JAXBContext.newInstance(new Class[] {SearchResult.class}, properties);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum16943280/input.xml");
        SearchResult result = (SearchResult) unmarshaller.unmarshal(xml);

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

}

input.xml/出力

<?xml version="1.0" encoding="UTF-8"?>
<searchResult>
   <results>
      <OrganizationUnitElement/>
      <OrganizationUnitElement/>
   </results>
</searchResult>

input.xml/出力

<?xml version="1.0" encoding="UTF-8"?>
<searchResult>
   <results>
      <GaDictionaryElement/>
      <GaDictionaryElement/>
   </results>
</searchResult>
于 2013-06-05T20:34:57.393 に答える