2013-11-10 39 views
3

FOUND解決技術問題對於誰將會被卡住像我的人!:爲了處理第三方Java或Scala的對象爲傑克遜反序列化 ,您可以使用混入(但您需要重新配置傑克遜映射器或用戶模塊) 或 您可以簡單地創建一個名爲MyClassDeserializer的類,該類擴展JsonDeserializer 並使用@JsonDeserialize(using = MyClassDeserializer.class)註釋。jongo /傑克遜反序列化scala.option在Java

爲例:

它真的很簡單,就像一個魅力! :)我遇到一些不好的時間,試圖用傑克遜Jongo

public class User implements Identity{ 
    @JsonProperty("_id") 
    private String id; 
    public Option<String> email; 
} 

選項是一個抽象類,我真的很新的這反序列化這個

public class User implements Identity{ 
     @JsonProperty("_id") 
     private String id; 
     @JsonDeserialize(using = OptionDeserializer.class) 
     public Option<String> email; 
    } 



public class OptionDeserializer extends JsonDeserializer<Option> { 
     @Override 
     public Option deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { 
      //code can be improved 
ObjectCodec oc = jsonParser.getCodec(); 
      JsonNode node = oc.readTree(jsonParser); 
      return Option.apply(node.get("email").getText()); 
     } 
    } 

好傢伙,有沒有實際上告訴傑克遜如何翻譯它的方法?

這個用戶對象被正確保存到mongo,但不能被讀取:/我花了這麼多小時試圖瞭解你們是我的最後一招! 謝謝(繼續尋找)

造成的:com.fasterxml.jackson.databind.JsonMappingException:能 無法構建scala.Option,問題的實例:抽象類型要麼 需要映射到具體類型,已經自定義解串器,或者被 實例化,附加類型信息 at [來源:[email protected]; POS: 237](通過參考鏈:models.User [ 「電子郵件」])

+0

什麼是「Option」類,它是否包含默認的構造函數? –

+0

你好Michal Option類是一個Scala類:/我使用第三部分liobrary,在我的Java項目中使用scala,並且我需要序列化一個包含Option字段的對象。 –

+0

thx michal我找到了問題的解決方案,並將其發佈在我的第一篇文章中,供未來用戶使用 –

回答

1

發帖POPO喬的回答作爲一個答案:

FOUND解決技術問題對於誰將會被卡住喜歡的人我爲了處理第三方java或scala對象的jackson反序列化,你可以使用Mixins(但你需要重新配置jackson映射器或用戶模塊),或者你可以簡單地創建一個名爲MyClassDeserializer的類來擴展JsonDeserializer並使用@JsonDeserialize(使用= MyClassDeserializer.class)註釋。

例如:

它真的很簡單,就像一個魅力! :)

public class User implements Identity{ 
    @JsonProperty("_id") 
    private String id; 
    @JsonDeserialize(using = OptionDeserializer.class) 
    public Option<String> email; 
} 

public class OptionDeserializer extends JsonDeserializer<Option> { 
    @Override 
    public Option deserialize(JsonParser jsonParser, 
    DeserializationContext deserializationContext) throws IOException, 
    JsonProcessingException {` 

     //code can be improved` 

     ObjectCodec oc = jsonParser.getCodec(); 
     JsonNode node = oc.readTree(jsonParser); 
     return Option.apply(node.get("email").getText()); 
    } 
}