8

私は JAXB を使用するプロジェクトに取り組んでいますが、JAXB と char データ型で小さな問題に遭遇しました。

char gender = 'M';

マーシャリング後に次のように変換します。

<gender>77</gender>

したがって、charは整数にマップされていると思いますが、単に文字列にマップしたいだけです。これどうやってするの?それは可能ですか?

4

5 に答える 5

6

いくつかの実験の後、プリミティブ文字を適切に処理するように 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 フィールドを文字列に変更する以外は、それだけです。

于 2009-09-24T12:06:11.397 に答える
2

私が最初に頭に浮かんだこと:)

String gender = "M";
于 2009-09-23T16:47:29.250 に答える
1

これは、少なくとも 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
于 2010-07-06T13:15:46.523 に答える
0

専用の 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 を参照してください。

于 2010-08-14T00:01:56.523 に答える