我的春季启动应用程序中有一个Payment实体。考虑到所有可能的CRUD操作,我使用了read
的spring数据,并希望实现自定义create
操作。此实体也不允许delete
和update
。
所以这是我想要的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
请求进行响应,但失败了。
我希望我的解释清楚。我该如何解决这个问题?
答案 0 :(得分:3)
有时您可能希望为特定资源编写自定义处理程序。要利用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都可以正常工作。