PagingAndSortingRepository.findAll(Pageable)
でデータベースにアクセスすると、Page<ObjectEntity>
。ただし、DTOをエンティティではなくクライアントに公開したいです。エンティティをコンストラクタに挿入するだけでDTOを作成できますが、PageオブジェクトのエンティティをDTOにマッピングするにはどうすればよいですか? Springのドキュメントによると、Pageは読み取り専用操作を提供します。
また、Java 8.を手動でマップしたオブジェクトで新しいページを作成するにはどうすればよいですか?
ラムダ式なしで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;
}
});
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;
}
});
@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);
}
});
}
そして、Java8では:
Page<ObjectEntity> entities =
objectEntityRepository.findAll(pageable)
.map(ObjectDto::fromEntity);
FromEntityは、変換ロジックを含むObjectDtoの静的メソッドです。
これを行うだけで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;
}
最後に、ページをユーザーに返さず、ヘッダーにページの詳細を含むObjectDTOのリストを返すので、これが私の解決策になります。
public Page<ObjectEntity> findAll (Pageable pageable){
//logic goes here.
Page<ObjectEntity> page = objectRepository.findAll(pageable);
return page;
}
@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のページの詳細を複製する必要がないようにするためです。ページには以下が含まれることに注意することが重要です。
contentは返されるオブジェクトのリストであり、DTOにマッピングする必要がある唯一のものです。