使用自定义方法实现Spring Data Rest/HATEOAS

4

考虑到Spring Data存储库的自定义实现,我在存储库上使用@RepositoryRestResource来带来所有HATEOAS生成的好处:

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends  PagingAndSortingRepository<PersonNode,Long>,
                                            PersonRepositoryCustom {


    List<PersonNode> findBySurname(@Param("0") String name);
}

现在按照提到的文档,我已经创建了 PersonRepositoryCustom,并添加了一个简单的方法,用于介绍目的。
public interface PersonRepositoryCustom {

    public String printPerson(PersonNode personNode);
}

实现方式为:
public class PersonRepositoryImpl implements PersonRepositoryCustom{

    @Override
    public String printPerson(PersonNode personNode) {
        return "It Works!";
    }
}

我希望默认的SDR自动生成的端点保持不变,只需添加新的自定义方法/新的实现。 我该如何在Spring Data Rest/HATEOAS中使用这个自定义方法? 使用简单的@RepositoryRestResource会自动生成控制器端点。如果我想提供一些自定义方法,我应该手动创建控制器,但在这个示例情况下它应该是什么样子呢?
2个回答

1
首先,像public String printPerson(PersonNode personNode)这样的方法在仓库上是一种RPC风格的API,它是已知的反模式,因此您应该以符合REST的方式设计API(例如,请参见如何为非CRUD“命令”(例如激活和停用资源)设计REST API?)。
解决您问题的方案如下:
  1. 创建一个自定义的@RestController(如您所想),其中定义了@RequestMapping来调用相关实现的自定义方法。

  2. 为您的实体创建一个新的ResourceProcessor并覆盖其process方法,在资源中添加一个新链接,指向您的自定义方法,例如/people/{id}/printPerson或任何您的映射定义。

以下是我的项目示例(Blog实体需要列出其Categories):
@Component
public static class BlogResourceProcessor implements ResourceProcessor<Resource<Blog>> {
    @Override
    public Resource<Blog> process(Resource<Blog> blogResource) {
        UriComponents uriComponents = ServletUriComponentsBuilder.fromCurrentContextPath()
                .path("/blog/{id}/categories").buildAndExpand(Long.toString(blogResource.getContent().getId()));
        blogResource.add(new Link(uriComponents.toUriString(), "categories"));
        return blogResource;
    }
}

-1

自定义方法被添加,这样您就可以在代码的其他地方使用它,就像使用PersonRepository一样。它不会自动将其映射到REST操作,但现有的PagingAndSortingRepository映射将保持不变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接