2011-11-09 16 views
1

JAXBでXmlTypeAdaptersを使用してマッピングする方法については、多くの例があります。JAXBでのオブジェクト型のマッピング方法

しかし、私の状況はどのタイプでも可能なフィールドです(つまりJavaのObject.class)。私が望むのは、基本的には、そのフィールドのマーシャリング/アンマーシャリングのためのすべてのコントロールを私に渡すアダプタを使用することです。ここでも、私は着信タイプを知らないし、実行時以外の発信タイプも知らない。例えば

@XmlRootElement(name="myType") 
@XmlAccessorType(XmlAccessType.FIELD) 
class MyType { 
    @XmlElement("value") 
    @XmlJavaTypeAdapter(ValueAdapter.class) 
    private Object value; 

    public static class ValueAdapter extends XmlAdapter<Object, Object> { 

     public ValueAdapter() { 

     } 

     public Object marshal(Object value) { 
      if (value instanceof Date) { 
       // do date stuff 
      } 
      else if (value instanceof Foo) { 
       // do foo stuff 
      } 
      // ... etc ... 
      else { 
       return value; 
      } 
     } 

     public Object unmarshal(Object value) { 
      if (value instanceof Date) { 
       // do date stuff 
      } 
      else if (value instanceof Foo) { 
       // do foo stuff 
      } 
      // ... etc ... 
      else { 
       return value; 
      } 
     } 
    } 

    // getter/setter fluff ... 

} 

しかし、ジャクソンを使用して、ValueAdapterが呼び出されません。

これはJAXBでこれを行う正しい方法ですか?そうでない場合、これを行う方法は何ですか?

+1

Gaaah! +1ポンドポイント。私はアダプタでブレークポイントに達するのを見ていませんでした。私のIDEで私のプロジェクトを掃除した後、ブレークポイントは期待通りにヒットし、上記の解決策が働きます。私はこれが誰かを助けることを望む。 – Caleb

答えて

0

これはうまく動作します。今、あなたがジャクソンを使っているので、完全に自動化された方法もあります。

特に多型の場合は、@JsonTypeInfo注釈を使用して適切な処理を行うことができます。注釈は、シリアル化するときにタイプ情報を追加し、デシリアライズ時に使用します。実際の具体的な型にハンドラ(標準​​のJDK型、Bean、他の型のコレクション)がある限り、それだけで十分です。

関連する問題