3

xsd から生成されたクラスをマーシャリングして xml(gml) を生成する際に問題があります (maven2 xjc プラグインを使用しています)。

次のような gml:nilReason 属性を持つ要素で問題が発生します。

               <element name="foo" nillable="true" maxOccurs="unbounded">
                    <complexType>
                        <complexContent>
                            <extension base="string">
                                <attribute name="nilReason" type="gml:NilReasonType"/>
                            </extension>
                        </complexContent>
                    </complexType>
                </element>

生成されたクラスは次のようになります。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
public static class Foo
    extends String
{

    @XmlAttribute
    protected List<String> nilReason;

    /**
     * Gets the value of the nilReason property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the nilReason property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getNilReason().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link String }
     * 
     * 
     */
    public List<String> getNilReason() {
        if (nilReason == null) {
            nilReason = new ArrayList<String>();
        }
        return this.nilReason;
    }

    public boolean isSetNilReason() {
        return ((this.nilReason!= null)&&(!this.nilReason.isEmpty()));
    }

    public void unsetNilReason() {
        this.nilReason = null;
    }

    public boolean isNil() {
        return nil;
    }

    public void setNil(boolean nil) {
        this.nil = nil;
    }

}

問題は、属性 nilReason を xsi:nil と一緒に設定する必要があることです。Foo のインスタンスを作成し、nilReason リスト値 ex に追加するとします。「テンプレート」には、xsi:nil 属性が true に設定されていません。null オブジェクトをリストに追加すると、xsi:nil="true" が取得されますが、nilReason 値を設定できません。

いくつかのバインド方法を探してみましたが、うまくいきませんでした。

私が見つけた唯一の解決策は、次のように生成されたクラスに属性を手動で追加することです。

@XmlAttribute(namespace = "http://www.w3.org/2001/XMLSchema-instance")
    private boolean nil;

しかし、生成されたクラスへの干渉を避けたいと思っています。

何か案は?

4

0 に答える 0