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.*;
詳細については