2012-01-18 157 views
6

使用澤西我喜歡定義一個服務:使用傑克遜ObjectMapper與泛型的POJO代替LinkedHashMap的

@Path("/studentIds") 
public void writeList(JsonArray<Long> studentIds){ 
//iterate over studentIds and save them 
} 

其中JsonArray是:

public class JsonArray<T> extends ArrayList<T> { 
    public JsonArray(String v) throws IOException { 
     ObjectMapper objectMapper = new ObjectMapper(new MappingJsonFactory()); 
     TypeReference<ArrayList<T>> typeRef = new TypeReference<ArrayList<T>>() {}; 
     ArrayList<T> list = objectMapper.readValue(v, typeRef); 
     for (T x : list) { 
      this.add((T) x); 
     } 
    } 
} 

這一切正常,但是當我做更復雜的東西:

@Path("/studentIds") 
public void writeList(JsonArray<TypeIdentifier> studentIds){ 
//iterate over studentIds and save them by type 
} 

凡Bean是一個簡單的POJO如

public class TypeIdentifier { 
    private String type; 
    private Long id; 
//getters/setters 
} 

整件事發生了可怕的事情。它將一切轉換爲LinkedHashMap而不是實際的對象。我可以得到它的工作,如果我手動創建類如:

public class JsonArrayTypeIdentifier extends ArrayList<TypeIdentifier> { 
    public JsonArrayTypeIdentifier(String v) throws IOException { 
     ObjectMapper objectMapper = new ObjectMapper(new MappingJsonFactory()); 
     TypeReference<ArrayList<TypeIdentifier>> typeRef = new TypeReference<ArrayList<TypeIdentifier>>(){}; 
     ArrayList<TypeIdentifier> list = objectMapper.readValue(v, typeRef); 
     for(TypeIdentifier x : list){ 
      this.add((TypeIdentifier) x); 
     } 
    } 
} 

但我試圖保持這個很好,通用,而無需添加額外的類遍及。任何線索爲什麼只有通用版本發生這種情況?

+0

查看可能與接受的答案重複:http://stackoverflow.com/questions/6062011/jackson-is-not-deserialising-a-generic-list-that-it-has-serialised – 2013-04-14 15:23:16

回答

1

首先,它適用於Longs,因爲它是一種本地類型,並且是JSON整數的默認綁定。

但是,爲什麼泛型類型信息不正確地傳遞:這很可能是由於與JAX-RS API傳遞鍵入MessageBodyReader S和MessageBodyWriter S中的方法問題 - 通過java.lang.reflect.Type不是(可惜!)足以傳遞實際的通用聲明(欲瞭解更多信息,請閱讀this blog entry)。

一個簡單的解決辦法是創建助手類型,如:

class MyTypeIdentifierArray extends JsonArray<TypeIdentifier> { } 

,並使用該類型 - 事情會「只是工作」,因爲超強型通用信息會始終保留。

+0

你的工作沒有'工作。 (仍然給我LinkedHashMap作爲解析結果。回到我的長解決方法。嘆氣。 – 2012-01-18 17:38:20

+0

它肯定應該工作 - 你能告訴我你究竟如何解析它們?LinkedHashMap只有在缺少類型信息(或如果'Object.class'被定義爲類型),這是哪個傑克遜版本? – StaxMan 2012-01-18 19:50:42

+0

傑克遜版本1.9.2; – 2012-01-19 21:14:34