Pytanie Jak zmapować stronę na stronę w spoczynku danych źródłowych


Kiedy trafiam do bazy danych przy pomocy PagingAndSortingRepository.findAll(Pageable) dostaję Page<ObjectEntity>. Chcę jednak ujawnić DTO klientowi, a nie podmiotom. Mogę stworzyć DTO po prostu poprzez wstrzyknięcie obiektu do jego konstruktora, ale jak mogę odwzorować obiekty w obiekcie strony na DTO? Zgodnie z dokumentacją źródłową, Strona zapewnia operacje tylko do odczytu.

Ponadto, strona.map nie jest możliwa, ponieważ nie mamy obsługi języka Java 8. Jak ręcznie utworzyć nową stronę z odwzorowanymi obiektami?


21
2017-08-19 10:30


pochodzenie


Nie jestem pewien, ale domyślam się, że możesz go użyć Page.map bez wyrażeń lambda. Po prostu przekaż instancję Converter<? super T, ? extends S> - Ali Dehghani
To jest poprawne - Tuomas Toivonen


Odpowiedzi:


Nadal możesz korzystać z Page.map bez wyrażeń lambda:

Page<ObjectEntity> entities = objectEntityRepository.findAll(pageable);
Page<ObjectDto> dtoPage = entities.map(new Converter<ObjectEntity, ObjectDto>() {
    @Override
    public ObjectDto convert(ObjectEntity entity) {
        ObjectDto dto = new ObjectDto();
        // Conversion logic

        return dto;
    }
});

23
2017-08-19 10:56





Oto moje rozwiązanie, dzięki @Ali Dehghani

private Page<ObjectDTO> mapEntityPageIntoDTOPage(Page<ObjectEntity> objectEntityPage) {
        return objectEntityPage.map(new Converter<ObjectEntity, ObjectDTO>() {
            public ObjectDTO convert(ObjectEntity objectEntity) {
                return new ObjectDTO(objectEntity, httpSession);
            }

        });
    }

3
2017-08-19 10:57





W Spring Data 2 metoda Page map przyjmuje funkcję zamiast konwertera, ale nadal działa w zasadzie tak samo, jak opisano to przez @Ali Dehghani.

Używanie funkcji:

Page<ObjectEntity> entities = objectEntityRepository.findAll(pageable);
Page<ObjectDto> dtoPage = entities.map(new Function<ObjectEntity, ObjectDto>() {
    @Override
    public ObjectDto apply(ObjectEntity entity) {
        ObjectDto dto = new ObjectDto();
        // Conversion logic

        return dto;
    }
});

2
2018-02-16 17:07





I w java8:

Page<ObjectEntity> entities = 
 objectEntityRepository.findAll(pageable)
 .map(ObjectDto::fromEntity);

Where fromEntity to statyczna metoda ObjectDto, która zawiera logikę konwersji.


0
2018-01-11 10:53





Na końcu nie zwrócisz strony użytkownikom, ale listę ObjectDTO, ze szczegółami strony w nagłówku, więc to będzie moje rozwiązanie.

ObjectService

public Page<ObjectEntity> findAll (Pageable pageable){
  //logic goes here.
  Page<ObjectEntity> page = objectRepository.findAll(pageable);
  return page;
} 

ObjectResource / rest (odsłonięty punkt końcowy)

@GetMapping
public ResponseEntity<List<ObjectDTO>> findAll (Pageable pageable){
  Page<ObjectEntity> page = objectServiceService.findAll(pageable);

  HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "your-endpoint-here");

  return new ResponseEntity<>(objectMapper.toDto(page.getContent()), headers, HttpStatus.OK);
}

Powodem tego jest to, że nie trzeba powielać szczegółów strony dla ObjectEntity i DTO. Należy pamiętać, że strona zawiera:

  • numer strony
  • rozmiar strony
  • numberOfElements
  • zadowolony

The zadowolony jest listą zwróconych obiektów i jest jedyną rzeczą, która musi zostać zmapowana do DTO.


0
2018-03-27 13:39