我想使用杰克逊序列化一个对象包括一个通用的集合类型。 这是接口:杰克逊序列化通用集合
public interface PagingAdapter <Id extends Serializable, T extends Entity<Id>> extends Serializable {
public List<T> getItem();
public void setItem(List<T> items);
public Boolean hasNextPage();
public Integer getTotalPage();
public Integer getPageSize();
public void setPageSize(int pageSize);
public Long getTotalItem();
public void setTotalItem(Long totalItem);
public void setCurrentPage(Integer currentPage);
public Integer getCurrentPage();
public Class<T> getEntityType();
public void setEntityType(Class<T> entityType);
}
,这是实现:
public class PagingAdapterImpl<Id extends Serializable, T extends Entity<Id>> implements
PagingAdapter<Id,T> {
private static Integer DEFAULT_PAGE_SIZE = 20;
private Class<T> entityType;
private List<T> items = null;
private Integer pageSize = DEFAULT_PAGE_SIZE;
private Integer currentPage = 0;
private Long totalItem;
public PagingAdapterImpl(List<T> items, int currentPage, int pageSize, long totalItem) {
super();
this.items = items;
this.pageSize = pageSize;
this.currentPage = currentPage;
this.totalItem = totalItem;
}
public PagingAdapterImpl(){
}
@Override
public Class<T> getEntityType() {
return entityType;
}
@Override
public void setEntityType(Class<T> entityType) {
this.entityType = entityType;
}
@Override
public List<T> getItem() {
return items;
}
@Override
public void setItem(List<T> items) {
this.items = items;
}
@Override
public Boolean hasNextPage() {
return false;
}
@Override
public Integer getTotalPage() {
int rs = (int) (getTotalItem() % getPageSize() == 0 ? getTotalItem()
/getPageSize() : getTotalItem()/getPageSize() + 1);
return 0;
}
@Override
public Integer getPageSize() {
return this.pageSize;
}
@Override
public Long getTotalItem() {
return this.totalItem;
}
@Override
public void setTotalItem(Long totalItem) {
this.totalItem = totalItem;
}
@Override
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
@Override
public Integer getCurrentPage() {
return currentPage;
}
@Override
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
}
我使用RestEasy的杰克逊1.9。此对象的休息方法返回实例的输出如下所示:
{
"status": 0,
"data": {
"entityType": null,
"pageSize": 1,
"currentPage": 1,
"totalItem": 1,
"item": [],
"totalPage": 0
}
}
“item”属性无法序列化为JSON数组。我该如何解决这个问题?
public class PagingAdapterSerializer extends JsonSerializer<PagingAdapter<Long, Entity<Long>>> {
@Override
public void serialize(PagingAdapter<Long, Entity<Long>> value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeObjectField("item",value.getItem());
jgen.writeObjectField("totalItem",value.getTotalPage());
jgen.writeObjectField("pageSize",value.getPageSize());
jgen.writeObjectField("totalItem",value.getTotalItem());
jgen.writeObjectField("currentPage",value.getCurrentPage());
jgen.writeEndObject();
}
这是我的自定义序列化程序。但它不起作用
你的对象没有问题,你可以分享你如何调用杰克逊 – Bhavesh
我使用自定义杰克逊串行器,但很难指定泛型集合的实现类。它可以是任何实体类型。我想这就是为什么杰克逊不能序列化 – David