0

I want to use Jackson to serialize an object include a generic collection type. This is the interface:

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

and this is the implementation:

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

I'm using RestEasy with Jackson 1.9. Output of a rest method return instance of this object now like this:

{
  "status": 0,
  "data": {
    "entityType": null,
    "pageSize": 1,
    "currentPage": 1,
    "totalItem": 1,
    "item": [],
    "totalPage": 0
  }
}

The "item" property cannot be serialized to a JSON array. How can I fix this problem?

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

This is my custom serializer. But it doesn't works

David
  • 1
  • 1
  • 1
  • There is nothing wrong with your object, can you share how you are calling jackson – Bhavesh Mar 09 '16 at 05:23
  • I'm using custom Jackson serializer, but it's hard to specify a implement class for generic collection. It can be any entity type. I guess that's why Jackson cannot serialized – David Mar 09 '16 at 06:16

1 Answers1

0

Instead of writing each object to JsonGenerator, you can below code to serialize it for a defined object.

String toJson(Object object){
    JSONSerializer ser = new JSONSerializer().transform(new ExcludeNullTransformer(), void.class);
    ser.exclude("*.class");
    return ser.serialize(object);
}

Include dependency for latest jackson in your code.

Bhavesh
  • 882
  • 2
  • 9
  • 18
  • But where can I put this function to let RestEasy automatic serialize my object? – David Mar 09 '16 at 06:53
  • use this method to serialize your object instead of using your method – Bhavesh Mar 09 '16 at 07:14
  • Thank you. I fixed it. My object already worked with Jackson serialize, just my mistake about value of page size and current page – David Mar 11 '16 at 17:12