web-dev-qa-db-ja.com

spring-data-restでPage <ObjectEntity>をPage <ObjectDTO>にマップする方法

PagingAndSortingRepository.findAll(Pageable)でデータベースにアクセスすると、Page<ObjectEntity>。ただし、DTOをエンティティではなくクライアントに公開したいです。エンティティをコンストラクタに挿入するだけでDTOを作成できますが、PageオブジェクトのエンティティをDTOにマッピングするにはどうすればよいですか? Springのドキュメントによると、Pageは読み取り専用操作を提供します。

また、Java 8.を手動でマップしたオブジェクトで新しいページを作成するにはどうすればよいですか?

34
Tuomas Toivonen

ラムダ式なしでPage.mapを引き続き使用できます。

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;
    }
});
38
Ali Dehghani

Spring Data 2では、Page mapメソッドはConverterではなくFunctionを使用しますが、@ ALi Dehghaniの説明と基本的に同じように機能します。

機能を使用して:

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

@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
Tuomas Toivonen

そして、Java8では:

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

FromEntityは、変換ロジックを含むObjectDtoの静的メソッドです。

2
Mustafa

これを行うだけでPage.mapを使用できます。

public Page<ObjectDto> toPageObjectDto(Page<Object> objects) {
    Page<ObjectDto> dtos  = objects.map(this::convertToObjectDto);
    return dtos;
}

private ObjectDto convertToObjectDto(Object o) {
    ObjectDto dto = new ObjectDto();
    //conversion here
    return dto;
}
1
Ilias Mentz

最後に、ページをユーザーに返さず、ヘッダーにページの詳細を含むObjectDTOのリストを返すので、これが私の解決策になります。

ObjectService

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

ObjectResource/rest(公開されたエンドポイント)

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

これを使用する理由は、ObjectEntityとDTOのページの詳細を複製する必要がないようにするためです。ページには以下が含まれることに注意することが重要です。

  • ページ番号
  • ページサイズ
  • numberOfElements
  • コンテンツ

contentは返されるオブジェクトのリストであり、DTOにマッピングする必要がある唯一のものです。

0
Peter Mutisya