0

私はここでどういうわけかトリッキーな状況にあります。一方で、この xsd スキームと同期する必要がある一方で、この xsd から生成されたクラスは何らかの形で役に立ちません。

<xs:schema>
    ...
    <xs:complexType name="Text">
        <xs:simpleContent>
            <xs:extension base="xs:string"/>
        </xs:simpleContent>
    </xs:complexType>
</xs:schema>

上記の xsd から生成されたクラスはこれです。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Text", propOrder = { "value" })
public class Text {
    @XmlValue
    protected String value; 
    .. getter .. setter
}

このクラスには文字列プロパティが 1 つしかないため、Class ではなく String 型に置き換えるのが理にかなっています。

質問: テキスト クラスをスキップして代わりに String を使用し、既存の xsd を保持するにはどうすればよいですか。

したがって、これを書く代わりに:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Description", propOrder = { "content" })
public class Description{
  @XmlElement(name = "Content") 
  protected Text content;

私はこのようなものを書きたい:

@XmlElement(name = "Content")   
@MagicHere_ThisTypeMappToText
protected String content;

テキストクラスをラップできるが、xsd で有効であることを保持する jaxb の注釈はありますか?

4

1 に答える 1

0

通常、オブジェクト (デ) シリアル化であるクラスを別のクラスにマップする場合は、XmlAdapter 実装が最​​適です。

あなたの場合 TextAdapter extends XmlAdapter<Text, String> {..}、トリックを行う必要があります。@XmlJavaTypeAdapter(TextAdapter.class)アノテーションを使用して、アダプターを 1 つのフィールドに明示的に割り当てることができます。

于 2013-07-24T13:10:01.320 に答える