有什么方法可以将@Projection接口用作SDR中资源的默认表示吗?通过SDR存储库还是通过自定义控制器?
过去在自定义控制器中可以通过注入a ProjectionFactory并使用createProjection方法来执行此操作,但是最近的Spring Data Rest更新已打破了这一点。
ProjectionFactory
createProjection
我想对实体执行特定的视图,并且SDR投影似乎是实现此目的的理想方法,尤其是在HAL API的情况下,而不是为自定义控制器编写硬DTO类并在它们之间进行映射等摘录不是我所追求的,因为它们仅在查看相关资源时适用。
为了回答我自己的问题,现在有两种简单的方法可以做到这一点。
您可以默认使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); }