Search code examples
javaspring-bootspring-dataprojection

Modify Spring data Page<> class projection response in service layer


I am using projection, and I need to format the date variable in list of objects, but Page<> type response is read only, so I can not iterate and modify the objects. What Should I do?

@Override
public Page<OrderDto> findAll(Pageable pageable) {
    return OrderDao.findByIsEnabledTrue(pageable, OrderDto.class);
}

I tried like this:

@Override
public Page<OrderDto> findAll(Pageable pageable) {

    Page<OrderDto> page = orderDao.findByIsEnabledTrue(pageable, OrderDto.class);

    List<OrderDto> orderDtos = page.getContent();

    orderDtos.stream().forEach(it ->{
        it.setFormattedCreatedAt(new SimpleDateFormat("dd-M-yyyy").format(it.getCreatedAt()));
    });

    page.getContent().clear();
    page.getContent().addAll(orderDtos);

    return page;
}

Solution

  • page.getContent() returns an unmodifiable list. The best approach is to use map method provided by page:

    @Override
    public Page<OrderDto> findAll(Pageable pageable) {
      Page<OrderDto> page = orderDao.findByIsEnabledTrue(pageable, OrderDto.class);
      page = page.map(this :: transformOrderDto);
      return page;
    }
    
    private OrderDto transformOrderDto(final OrderDto order) {
      order. setFormattedCreatedAt(new SimpleDateFormat("dd-M-yyyy").format(order.getCreatedAt()));
      return order;
    }