2015-06-22 97 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

感谢您的更新,并清楚了解幕后发生的情况。 –

相关问题