2015-06-22 98 views
3

我objectMapper被取Page<User>類型的值如下:com.fasterxml.jackson.databind.JsonMappingException:無法反序列化org.springframework.data.domain.Sort的情況下進行START_ARRAY令牌

userList = objectMapper.readValue(RestAdapter.get(url), new TypeReference<PageImplBean<User>>(){}); 

PageImplBean擴展PageImpl類,如下所示:

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 first; 
private boolean nextPage; 
private boolean last; 
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 isNextPage() { 
    return nextPage; 
} 

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


public boolean isFirst() { 
    return first; 
} 

public void setFirst(boolean first) { 
    this.first = first; 
} 

public boolean isLast() { 
    return last; 
} 

public void setLast(boolean last) { 
    this.last = last; 
} 

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()); 
} 
} 

我的倉儲類如下所示:

@EnableScan 
@EnableScanCount 
public abstract interface UserRepository extends PagingAndSortingRepository<User, String> 
{ 
    public abstract Page<User> findByAddressId(String paramString, Pageable paramPageable); 

    public abstract Page<User> findAll(Pageable paramPageable); 
}  

我的服務類是如下:

public Page<User> fetchUserList(String addressId,Integer pageNumber, Integer pageSize){ 
    Page<User> userPageList = null; 

     PageRequest pageRequest = new PageRequest(pageNumber - 1, pageSize, Direction.ASC, "addressId"); 
     userPageList = userRepository.findByAddressId(addressId, pageRequest); 

    return userPageList; 
} 

Page<User>從web服務對象由可分頁實例的與對象排序它由值[addressId:ASC]。

雖然反序列化對象userList與objectMapper如上所示,我遇到提到的錯誤。

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of org.springframework.data.domain.Sort out of START_ARRAY token 

任何幫助非常感謝。謝謝。

+0

你有沒有例子json? –

回答

10

今天早上我遇到了這個確切的問題。

CustomSortDeserializer

import java.io.IOException; 

import org.springframework.data.domain.Sort; 
import org.springframework.data.domain.Sort.Direction; 
import org.springframework.data.domain.Sort.Order; 

import com.fasterxml.jackson.core.JsonParser; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.DeserializationContext; 
import com.fasterxml.jackson.databind.JsonDeserializer; 
import com.fasterxml.jackson.databind.JsonNode; 
import com.fasterxml.jackson.databind.node.ArrayNode; 

public class CustomSortDeserializer extends JsonDeserializer<Sort> { 

@Override 
public Sort deserialize(JsonParser jp, DeserializationContext ctxt) 
     throws IOException, JsonProcessingException { 
    ArrayNode node = jp.getCodec().readTree(jp); 
    Order[] orders = new Order[node.size()]; 
    int i = 0; 
    for(JsonNode obj : node){ 
     orders[i] = new Order(Direction.valueOf(obj.get("direction").asText()), obj.get("property").asText()); 
     i++; 
    } 
    Sort sort = new Sort(orders); 
    return sort; 
} 

然後添加下面的的PageImplBean的公共無效setSort(排序排序)方法:

@JsonDeserialize(using=CustomSortDeserializer.class) 
public void setSort(Sort sort) { 
    this.sort = sort; 
} 

編輯:

這是我收到反序列化JSON(來自spring-data-commons-1.9.2.RELEASE):

[ 
    { 
    "direction": "ASC", 
    "property": "amount", 
    "ignoreCase": false, 
    "nullHandling": "NATIVE", 
    "ascending": true 
    }, 
    { 
    "direction": "ASC", 
    "property": "effectiveDate", 
    "ignoreCase": false, 
    "nullHandling": "NATIVE", 
    "ascending": true 
    } 
] 

如果你看Sort,你會發現它實現了Iteratable for Order。如果您檢查在同一個類中定義的Order,您將在我的示例JSON中看到這些字段。所以當Sort被序列化時,它被序列化爲Order列表,這就是爲什麼反序列化到Sort需要一個自定義的反序列化器實現的原因,以及爲什麼沒有自定義實現的反序列化失敗(因爲它試圖將數組反序列化爲單個對象)。

在反序列化期間,當每個屬性反序列化時遇到使用@JsonDeserializer註釋的setter時,Jackson使用提供的反序列化器反序列化該特定屬性。

+0

非常感謝。它完全解決了我的問題。但是,你能解釋一下在實現這個CustomSortDeserializer類之前和之後反序列化時發生了什麼? –

+0

我已更新我的回覆以幫助澄清您的問題。希望這有助於! –

+0

感謝您的更新,並清楚瞭解幕後發生的情況。 –

相關問題