小编典典

使用Spring Data Rest @Projection作为自定义控制器中资源的表示

spring-boot

有什么方法可以将@Projection接口用作SDR中资源的默认表示吗?通过SDR存储库还是通过自定义控制器?

过去在自定义控制器中可以通过注入a ProjectionFactory并使用createProjection方法来执行此操作,但是最近的Spring
Data Rest更新已打破了这一点。

我想对实体执行特定的视图,并且SDR投影似乎是实现此目的的理想方法,尤其是在HAL
API的情况下,而不是为自定义控制器编写硬DTO类并在它们之间进行映射等摘录不是我所追求的,因为它们仅在查看相关资源时适用。


阅读 490

收藏
2020-05-30

共1个答案

小编典典

为了回答我自己的问题,现在有两种简单的方法可以做到这一点。

您可以默认使SDR存储库查找器返回投影:

public interface PersonRepository extends PagingAndSortingRepository<Person,Long> {

    Set<PersonProjection> findByLastName(String lastName);

}

您还可以通过使用@BasePathAwareController创建自定义的Spring
MVC控制器,有选择地覆盖SDR默认情况下会为您处理的响应。如果您打算提供分页响应,则需要注入ProjectionFactory以及可能的PagedResourcesAssembler。

@BasePathAwareController
public class CustomPersonController {

@Autowired
private ProjectionFactory factory;

@Autowired
private PersonRepository personRepository;

@Autowired
private PagedResourcesAssembler<PersonProjection> assembler;

@RequestMapping(value="/persons", method = RequestMethod.GET, produces = "application/hal+json")
public ResponseEntity<?> getPeople(Pageable pageable) {
    Page<Person> people = personRepository.findAll(pageable);
    Page<PersonProjection> projected = people.map(l -> factory.createProjection(PersonProjection.class, l));
    PagedResources<Resource<PersonProjection>> resources = assembler.toResource(projected);
    return ResponseEntity.ok(resources);
}
2020-05-30