2013-01-21 27 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; 

    } 

}