2009-09-23 3 views
5

JAXBでプロジェクトを進めていますが、JAXBとcharデータ型で小さな問題が発生します。Java:JAXBとcharを使用する

char gender = 'M'; 

がに整列化した後に変換します:

<gender>77</gender> 

だから私は、charは整数にマッピングされていると思いますが、私は単純に文字列にマッピングします。これどうやってするの?それも可能ですか?私は私の心に入った:)

String gender = "M"; 
+1

性別をcharとして保存せず、代わりに 'enum'を使用してください。 –

+0

@Joachim Sauer:あなたは、enumがジェンダーを保存するためのより良い選択肢になると言って、あなたは正しいです。これは、より安全なだけでなく、それをマップすることもできます。しかし、私はJAXBの可能性を模索しています。そして、私はちょうど頑固なので、char:-pを使用する解決策がなければならないと考えました。 – Korenaga

+0

JAXB(Metro)の特定の実装におけるバグ、JAXB(EclipseLink MOXy)のマーシャル文字のその他の実装が正しくありません。 –

答えて

5

いくつかの実験をした後

+0

この問題は、特にJAXBのMetro実装に関連しており、JAXB(EclipseLink MOXy)の他の実装ではこのユースケースを正しく処理します。 –

1

まず最初は、適切に原始文字を処理するためにJAXBを設定する方法はないようです。私はそれを受け入れるのに苦労している。

XmlAdaptorを定義して文字列に変換しようとしましたが、実行時にはプリミティブではなくオブジェクト型の注釈付きアダプタしか受け付けられないようです。

私は考えることができる唯一の回避策は@XmlTransientとchar型のフィールドをマークし、その後取得し、文字列として値を設定ゲッターとセッターを書くことです:

@XmlTransient 
    char gender = 'M'; 

    @XmlElement(name="gender") 
    public void setGenderAsString(String gender) { 
     this.gender = gender.charAt(0); 
    } 

    public String getGenderAsString() { 
     return String.valueOf(gender); 
    } 

ない非常に素晴らしい、I'LLあなたに与えますが、文字列にcharフィールドを実際に変更するのには不足しています。それだけです。

1

これは依然として、Metro JAXB(RI)、少なくともJDK 1.6.0_20に同梱されているMetroのバージョンでは問題があるようです。

のEclipseLink JAXB(MOXY)マーシャルが正しくchar型:

を単にあなたのクラスパスにeclipselink.jarを追加しjaxb.propertiesがあなたのモデルクラスでファイルを追加のEclipseLink JAXBを使用するには次のエントリで:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 
0

の専門XmlAdapterのを作成します。

パッケージ全体にpackage-info.javaを登録することもできます(他のクラスの中で忘れないようにすることもできます)。

http://blogs.oracle.com/CoreJavaTechTips/entry/exchanging_data_with_xml_and 詳細については、トリックザッツ

+1

私は不思議ですね、なぜv.toString()の代わりに 'new String(new char [] {v})'を使うのですか? –

2
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class) 

それはあなたのアダプタでプリミティブ

で動作させるために型を指定するパッケージ情報にこれを用いた

は、あなたが発見したパッケージ

に対してグローバルにそれを行う意味しますこれは実験後です。

public class MyAdapter extends XmlAdapter<String, Integer> { 
関連する問題