2015-12-20 64 views
3

考虑Custom implementations for Spring Data repositories我使用存储库中的@RepositoryRestResource把所有的HATEOAS产生goodnes:春季数据REST/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控制器端点自动生成。如果我想提供一些自定义方法怎么办?我认为我将不得不手动创建控制器,但在这个示例中应该如何看待?

回答

0

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

0

首先,像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(你应该)与定义@RequestMapping S表示自定义的方法,它调用相关的实现。

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