使用@RepositoryRestController和@RepositoryRestResource对Spring Boot中的单个资源的冲突

时间:2018-02-15 20:19:15

标签: java spring spring-boot spring-data

我的春季启动应用程序中有一个Payment实体。考虑到所有可能的CRUD操作,我使用了read的spring数据,并希望实现自定义create操作。此实体也不允许deleteupdate

所以这是我想要的URL和每个的可重复组件:

GET /payments:PaymentRepository

GET /payments/{id}:PaymentRepository

POST /payments:PaymentController

这是我的存储库:

@RepositoryRestResource
public interface PaymentRepository extends PagingAndSortingRepository<Payment, Long> {

    // disable create and update
    @Override
    @RestResource(exported = false)
    Payment save(Payment entity);

    // disable delete
    @Override
    @RestResource(exported = false)
    void delete(Payment entity);
}

这是我的控制者:

@RepositoryRestController
@RequestMapping("/payments")
public class PaymentController {

    @PostMapping("")
    @ResponseBody
    public Payment create() {
        // some code...
    }

}

如果我将create操作映射到POST /payments/create等网址,则一切正常,但如果我使用上述代码并将create映射到POST /payments,则{{ 1}}网址不再有效,我收到GET /payments错误。 (405 Method Not Allowed仍然有效)

在这种情况下,似乎存在GET /payments/{id}注释,导致@PostMapping("")PaymentController请求进行响应,但失败了。

我希望我的解释清楚。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

Spring Data REST reference表示:

  

有时您可能希望为特定资源编写自定义处理程序。要利用Spring Data REST的设置,消息转换器,异常处理等,请使用@RepositoryRestController注释而不是标准的Spring MVC @Controller或@RestController。

没有明确提及,但使用@RepositoryRestController注释您的控制器还允许您为一个端点定义自定义行为,同时保留Spring自动生成的所有其他端点...在一个条件:{{ 1}}注释只能在method level使用(这实际上是参考文档示例中的内容)。

你的例子变成了:

@RequestMapping

通过这种方式,您可以将自定义端点映射到@RepositoryRestController public class PaymentController { @PostMapping("/payments") @ResponseBody public Payment create() { // some code... } } 个请求,以及Spring自动生成的所有端点,减去使用POST /payments注释的端点。

答案 1 :(得分:0)

@BasePathAwareController
@RepositoryRestController
public class PaymentController {

    @PostMapping("/payments")
    @ResponseBody
    public Payment create() {
        // some code...
    }

}

您应该以上述方式修改控制器。 @BasePathAwareController使自定义REST URI可以在您的基本URI下注册。 经过上述修改:两个API都可以正常工作。