2011-11-09 57 views
1

有很多關於如何使用XmlTypeAdapters在JAXB中映射的例子,這很好。如何映射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 dweeb指向我。我沒有看到適配器中的斷點。在我的IDE中清理我的項目後,斷點如預期的那樣命中,並且上面的解決方案起作用。我希望這可以幫助別人。 – Caleb

回答

0

很高興它的工作。現在,既然你在使用傑克遜,那麼也可能有完全自動的方式。

專門針對多態類型,通常可以通過使用@JsonTypeInfo註釋來獲得適當的處理 - 它將在序列化時添加類型信息,並在反序列化時使用該信息。只要實際的具體類型具有處理程序(標準JDK類型,bean,其他處理類型的集合),這就是您所需要的。

相關問題