【问题标题】:Spring Data Rest/HATEOAS with Custom Methods Implementation具有自定义方法实现的 Spring Data Rest/HATEOAS
【发布时间】:2016-03-26 14:00:52
【问题描述】:

考虑到 Custom implementations for Spring Data repositories 我正在使用存储库上的 @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,控制器端点是自动生成的。如果我想提供一些自定义方法怎么办?我想我必须手动创建控制器,但在这个示例案例中它应该是什么样子?

【问题讨论】:

    标签: spring-mvc spring-data-rest spring-hateoas


    【解决方案1】:

    首先,像public String printPerson(PersonNode personNode) 这样的存储库上的这种方法是一种 RPC 风格的 API,它是一种已知的反模式,所以你应该以 REST 兼容的方式设计你的 API(参见例如 How to design REST API for non-CRUD "commands" like activate and deactivate of a resource?

    您的问题的解决方案如下:

    1. 为自定义方法创建一个自定义@RestController(如您所愿),并为调用相关实现的自定义方法定义@RequestMappings。

    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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      添加了自定义方法,因此您可以在其他地方使用 PersonRepository 的代码中使用它。它不会神奇地将其映射到 REST 操作,但现有的 PagingAndSortingRepository 映射将保留。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-07
        • 2014-08-16
        • 2013-10-31
        • 2014-03-07
        • 2017-03-06
        • 2017-02-09
        • 2015-03-08
        • 2014-07-05
        相关资源
        最近更新 更多