2013-01-21 33 views
3

使用ObjectMapper時,我收到以下錯誤反序列化對象:JSONMappingException - 不能desierialize Java對象

JSONMappingException不能構造 org.springframework.data.Page的實例,提出問題:抽象類型只能用 與附加類型信息實例化。

我試圖序列化JSON字符串轉換成春的數據對象org.springframework.data.Page表示T類型的頁。

User類是一個簡單的POJO,其名稱爲firstlast。 JSON字符串我反序列化是:

{ 
    "content": [ 
     { 
      "firstname": "John", 
      "lastname": "Doe" 
     }, 
     { 
      "firstname": "Jane", 
      "lastname": "Doe" 
     } 
    ], 
    "size": 2, 
    "number": 0, 
    "sort": [ 
     { 
      "direction": "DESC", 
      "property": "timestamp", 
      "ascending": false 
     } 
    ], 
    "totalPages": 150, 
    "numberOfElements": 100, 
    "totalElements": 15000, 
    "firstPage": true, 
    "lastPage": false 
} 

這導致異常:

Page<User> userPage = (Page<User>) new ObjectMapper().mapToJavaObject(json, new TypeReference<Page<User>>(){}; 

由於Page是一個春天的對象,我不能改變它,我覺得做這個有點從我看到的方式不同這個問題在別處問過。有什麼想法嗎?

+1

我試過反序列化,與我提出的原始答案。但是頁面實現具有不能從輸入JSON中反序列化的虛擬屬性,並且會導致進程失敗。最好的辦法是編寫一個自定義bean來將JSON反序列化,然後用這個自定義bean的值實例化一個PageImpl。 – Perception

回答

10

最後我用這樣的事情,創造一個bean作爲@Perception建議:

import java.util.ArrayList; 
import java.util.List; 

import org.springframework.data.domain.PageImpl; 
import org.springframework.data.domain.PageRequest; 
import org.springframework.data.domain.Sort; 

public class PageImplBean<T> extends PageImpl<T> { 

    private static final long serialVersionUID = 1L; 
    private int number; 
    private int size; 
    private int totalPages; 
    private int numberOfElements; 
    private long totalElements; 
    private boolean previousPage; 
    private boolean firstPage; 
    private boolean nextPage; 
    private boolean lastPage; 
    private List<T> content; 
    private Sort sort; 

    public PageImplBean() { 
     super(new ArrayList<T>()); 
    } 

    public int getNumber() { 
     return number; 
    } 

    public void setNumber(int number) { 
     this.number = number; 
    } 

    public int getSize() { 
     return size; 
    } 

    public void setSize(int size) { 
     this.size = size; 
    } 

    public int getTotalPages() { 
     return totalPages; 
    } 

    public void setTotalPages(int totalPages) { 
     this.totalPages = totalPages; 
    } 

    public int getNumberOfElements() { 
     return numberOfElements; 
    } 

    public void setNumberOfElements(int numberOfElements) { 
     this.numberOfElements = numberOfElements; 
    } 

    public long getTotalElements() { 
     return totalElements; 
    } 

    public void setTotalElements(long totalElements) { 
     this.totalElements = totalElements; 
    } 

    public boolean isPreviousPage() { 
     return previousPage; 
    } 

    public void setPreviousPage(boolean previousPage) { 
     this.previousPage = previousPage; 
    } 

    public boolean isFirstPage() { 
     return firstPage; 
    } 

    public void setFirstPage(boolean firstPage) { 
     this.firstPage = firstPage; 
    } 

    public boolean isNextPage() { 
     return nextPage; 
    } 

    public void setNextPage(boolean nextPage) { 
     this.nextPage = nextPage; 
    } 

    public boolean isLastPage() { 
     return lastPage; 
    } 

    public void setLastPage(boolean lastPage) { 
     this.lastPage = lastPage; 
    } 

    public List<T> getContent() { 
     return content; 
    } 

    public void setContent(List<T> content) { 
     this.content = content; 
    } 

    public Sort getSort() { 
     return sort; 
    } 

    public void setSort(Sort sort) { 
     this.sort = sort; 
    } 

    public PageImpl<T> pageImpl() { 
     return new PageImpl<T>(getContent(), new PageRequest(getNumber(), 
       getSize(), getSort()), getTotalElements()); 
    } 
} 

,然後修改代碼以使用具體的類,並獲得PageImpl:

@SuppressWarnings("unchecked") 
Page<User> userPage = ((PageImplBean<User>)new ObjectMapper().readValue(json, new TypeReference<PageImplBean<User>>() {})).pageImpl(); 
+0

好的答案!唯一缺少的是兩個屬性:lastPage和firstPage應分別重命名爲last和first。 –

1

你可以做到這一點:

public class YourClass { 

    static class CustomPage extends PageImpl<User> { 

     @JsonCreator(mode = Mode.PROPERTIES) 
     public CustomPage(@JsonProperty("content") List<User> content, @JsonProperty("number") int page, @JsonProperty("size") int size, @JsonProperty("totalElements") long total) { 
      super(content, new PageRequest(page, size), total); 
     } 

    } 

    public Page<User> makeRequest(String json) { 

     Page<User> pg = new ObjectMapper().readValue(json, CustomPage.class); 
     return pg; 

    } 

}