Spring 数据存储库和休息控制器:端点混合和覆盖

Spring data repository and rest controller: end point mixing & overriding

为 REST 资源公开以下端点是很常见的

@GET customers/ ==> list of customers
@POST customers/ ==> add a customer
@Get customers/:id ==> specific info of customer
@PUT customers/:id ==> override a customer
@PATCH customers/:id ==> update customer

Spring 数据存储库可以很好地处理这个问题。

但是如果我想添加自定义端点,例如

@GET customers/recent ==> 检索最近访问过的客户 @GET customers/:id/photo ===> 所有属于该客户的照片

有没有办法添加到现有的端点集?

当然,我们可以在 @RestController 注释 class 中重复所有惯用代码,但是对于 10+ 资源来说,这将是非常重复的。

我要找的是这样的

class CustomerController{
    // all @GET, @POST, @PUT, @PATCH methods are already generated, like a data rest repository

    @RequestMapping(value = "/{customerId}/photo", method = RequestMethod.GET)
    public Collection<Photo> getAllPhotos(){
        ...
    }

    // it is also possible to override @POST request here 
    public Collection<Customer> getCustomers(){
        // more logic
    }
}

只需向您的存储库接口添加一个方法。

class CustomerRepository {

    public List<Customer> findRecent();      

}

给定的方法将在 /customers/findRecent 下导出。您可以使用 @RestResource 注释调整路径。

谈谈你的第二个案例,例如@GET customers/:id/photo,t 由 Spring 数据 Rest 透明处理,这意味着,如果您的实体 Customer 有一个 photo association,它是在开箱即用的 url 下导出的。