7

「名前」と「アドレス」の2つのフィールドを持つオブジェクトがあります。JAXBは、オブジェクトをXMlに変換するときに、空の要素を無視します。

例:name="xyz"とaddress=nullがある場合、outは

<name>xyz</name>

しかし、私が出力として欲しいものは

<name>xyz</name>
<address></address>

私はオプションを見ました@XmlElement(nillable="true")が、これは次のように出力を与えます

<name>xyz</name>
<address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>

希望の出力を得るのを手伝ってください。

前もって感謝します。

4

3 に答える 3

9

JAXB(JSR-222)実装は、空の文字列値を空の要素として出力します""。プロパティをこれに設定しaddressて、目的の効果を得ることができます。


更新#1

質問を更新しました。基本的に、アドレス要素はNULLです。このソリューションはそれにも適用できますか?

マーシャルイベントコールバックを利用して、の値を調整できますaddress

import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {

    private String name;
    private String address;

    private void beforeMarshal(Marshaller marshaller) {
        if(null == address) {
            address = "";
        }
    }

    private void afterMarshal(Marshaller marshaller) {
        if("".equals(address)) {
            address = null;
        }
    }

}

更新#2

唯一の懸念は、クラスに10個のフィールドがある場合、すべてのフィールドに対してifを記述しなければならないということです。他に解決策はありますか?

EclipseLink MOXyをJAXBプロバイダーとして使用する場合(私はMOXyのリードです)、XmlAdapterこのユースケースにを使用できます。

XmlAdapter(StringAdapter)

package forum14691333;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class StringAdapter extends XmlAdapter<String, String> {

    @Override
    public String marshal(String string) throws Exception {
        if(null == string) {
            return "";
        }
        return string;
    }

    @Override
    public String unmarshal(String string) throws Exception {
        if("".equals(string)) {
            return null;
        }
        return string;
    }

}

package-info

次に、パッケージレベルで指定すると、そのパッケージString内のタイプのすべてのマップされたフィールド/プロパティに適用されます。

@XmlJavaTypeAdapter(value=StringAdapter.class, type=String.class)
package forum14691333;

import javax.xml.bind.annotation.adapters.*;

詳細については

于 2013-02-04T16:51:57.620 に答える
1

JAXBプロバイダーとしてEclipseLinkMOXyを使用する場合は、

@XmlNullPolicy(emptyNodeRepresentsNull = true, nullRepresentationForXml = XmlMarshalNullRepresentation.EMPTY_NODE)
@XmlElement(name = "address", nillable = true)
private String address;

このように使用することで、すべてのフィールドにアダプターを作成する必要がなくなります。

于 2016-07-25T09:12:52.050 に答える
0

フィールドに空の文字列のデフォルト値を設定するだけです。

@XmlElement(required="true")
private String address = "";

そしてあなたは得るでしょう

<address></address>
于 2017-11-16T16:25:19.943 に答える