当前位置: 首页 > 知识库问答 >
问题:

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

洪俊能
2023-03-14

以前,在自定义控制器中可以通过注入ProjectionFactory并使用CreateProjection方法来实现这一点,但最近的Spring Data Rest更新打破了这一点。

我希望在实体上强制执行一个特定的视图,而SDR预测似乎是这样做的理想方法,特别是在HAL API的上下文中,而不是为自定义控制器编写硬DTO类并在它们之间进行映射等。节选预测不是我想要的,因为这些仅适用于查看相关资源时。

共有1个答案

黄磊
2023-03-14

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

您可以使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);
}
 类似资料:
  • 我正在通过数据库开发一组rest资源,并使用Spring Data Rest公开核心CRUD功能,以直接与存储库交互。 在我的简化示例中,我有以下用户: 和用户自己的项目: 直接与存储库交互是可以的,所以对于创建用户(其他简单实体),问题来自于创建项目。项目有大量基于用户表单输入的服务器派生字段,所以我编写了一个自定义控制器来生成它们并保存结果。为了持久化结果,我需要将项目与其拥有的用户相关联。我

  • 我正在使用Spring-boot-starter-data-rest的Spring Boot1.5.10。 如果导航到http://localhost:8080/api/v1/users,就会得到如下内容: 但我想使用自定义控制器,使用@RepositoryRestController向“http://localhost:8080/api/v1/users/search”添加一个新的endpoin

  • 我试图向RepositoryRestResource中自动生成的endpoint添加一些额外的业务逻辑。请参见下面的代码: 资源: 控制器: 我看过下面两篇stackoverflow的文章: 我可以让自定义控制器镜像Spring-Data-Rest / Spring-Hateoas生成的类的格式吗? 在自定义控制器方法的 Spring Boot 中启用 HAL 序列化 我觉得我很接近了,但我面临的

  • 我在Spring boot data rest中使用MongoRepository,它工作得很好,不需要实现我自己的控制器。但是我想把“注册日期”放在我新创建的对象中,默认实现不支持这个。我需要实现我自己的自定义控制器,以便在每个新对象中添加额外的字段。问题是当我实现我自己的控制器时,HATEOAS停止工作。 存储库类: 控制器类: 带有此自定义控制器的有效负载如下所示: 没有我的自定义控制器的有

  • 来自数据库表的REST资源 我最近学习了一些关于REST的东西(其中许多我部分理解)。我也做了一些简单的演示,这些演示不是很rest,但至少我尝试了一些resting的东西。但是,当涉及到从零开始开发一些真实世界的应用程序时,我就笨手笨脚了。 null 这个问题是我之前关于如何基于一些表以restful方式决定资源的问题的延续 请不要说没有这样规定的标准。应该有一个:。我只是要求一个方法…只是一些

  • 我有一个POJO类患者,具有以下特征: 现在从我的Rest控制器中,我只需要在json中发送患者的姓名、电话号码、电子邮件和地址。我希望json输出为 此处仅将检查成功/失败添加为标志。