具有自定义方法实现的Spring Data Rest / HATEOAS

时间:2015-12-20 09:44:05

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

考虑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数据Rest / HATEOAS这个自定义方法? 使用简单@RepositoryRestResource,控制器端点将自动生成。如果我想提供一些自定义方法怎么办?我认为我必须手动创建控制器,但在这种示例性情况下它应该如何?

2 个答案:

答案 0 :(得分:0)

首先,像public String printPerson(PersonNode personNode)这样的存储库上的这种方法是RPC样式的API,它是一种已知的反模式,因此您应该以符​​合REST的方式设计API(参见例如{{ 3}})

您的问题的解决方案可能如下所示:

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

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

  3. 这是我项目中的一个示例(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 :(得分:-1)

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