私は JAXB を使用するプロジェクトに取り組んでいますが、JAXB と char データ型で小さな問題に遭遇しました。
char gender = 'M';
マーシャリング後に次のように変換します。
<gender>77</gender>
したがって、charは整数にマップされていると思いますが、単に文字列にマップしたいだけです。これどうやってするの?それは可能ですか?
私は JAXB を使用するプロジェクトに取り組んでいますが、JAXB と char データ型で小さな問題に遭遇しました。
char gender = 'M';
マーシャリング後に次のように変換します。
<gender>77</gender>
したがって、charは整数にマップされていると思いますが、単に文字列にマップしたいだけです。これどうやってするの?それは可能ですか?
いくつかの実験の後、プリミティブ文字を適切に処理するように JAXB を構成する方法はないようです。なかなか受け入れられないけど。
を定義XmlAdaptor
して文字列に強制しようとしましたが、ランタイムは、プリミティブではなく、オブジェクト型で注釈が付けられたアダプターのみを受け入れるようです。
私が考えることができる唯一の回避策は、 char フィールドを でマークし@XmlTransient
、値を文字列として取得および設定するゲッターとセッターを記述することです。
@XmlTransient
char gender = 'M';
@XmlElement(name="gender")
public void setGenderAsString(String gender) {
this.gender = gender.charAt(0);
}
public String getGenderAsString() {
return String.valueOf(gender);
}
あまりいいとは言えませんが、実際に char フィールドを文字列に変更する以外は、それだけです。
私が最初に頭に浮かんだこと:)
String gender = "M";
これは、少なくとも JDK 1.6.0_20 に同梱されている Metro のバージョンでは、Metro JAXB (RI) の問題のようです。
EclipseLink JAXB (MOXy)はcharを正しくマーシャリングします:
EclipseLink JAXBを使用するには、eclipselink.jarをクラスパスに追加し、次のエントリを使用してモデル・クラスにjaxb.propertiesファイルを追加するだけです:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
専用の XmlAdapter を作成します。
package br.com.maritima.util;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class CharAdapter extends XmlAdapter<String,Character>{
@Override
public String marshal(Character v) throws Exception {
return new String(new char[]{v});
}
@Override
public Character unmarshal(String v) throws Exception {
if(v.length()>0)
return v.charAt(0);
else return ' ';
}
}
次に、package-info.java を使用してパッケージ全体に登録するか (他のクラス内で忘れないようにします)、特定のフィールドに限定して使用できます。
詳細については、 http://blogs.oracle.com/CoreJavaTechTips/entry/exching_data_with_xml_and を参照してください。