使用 Spring Data REST 的自定义控制器隐藏默认端点
Custom controller with Spring Data REST hide default endpoints
我正在使用 Spring Boot,Spring Data REST,Spring HATEOAS,Hibernate,JPA。
我在我的应用程序中广泛使用 Spring 数据 REST,并且公开了我的实体的所有存储库。
不幸的是,有些特殊情况并不那么容易管理。
其中之一是:
我有一个自定义控制器:
@Api(tags = "CreditTransfer Entity")
@RepositoryRestController
@RequestMapping(path = "/api/v1")
@PreAuthorize("isAuthenticated()")
public class CreditTransferController {
@RequestMapping(method = RequestMethod.GET, path = "/creditTransfers/{id}")
public ResponseEntity<?> findAll(@PathVariable("id") long id, HttpServletRequest request, Locale locale,
PersistentEntityResourceAssembler resourceAssembler) {
//my code
}
@RequestMapping(method = RequestMethod.DELETE, path = "/creditTransfers/{id}")
public ResponseEntity<?> deleteMovement(@PathVariable("id") long id, HttpServletRequest request, Locale locale,
PersistentEntityResourceAssembler resourceAssembler) {
//my code
}
这里的问题是覆盖这些端点,我隐藏了 Spring Data REST 创建的 /search 端点。这对我来说非常重要。
我没有找到任何聪明的方法来让它工作而不干扰 Spring Data REST 提供的默认端点。
有办法解决我的问题吗?
============================================= =========================
一个小的改进是使用这样的映射:
@RequestMapping(method = RequestMethod.DELETE, path = "/creditTransfers/{id:[0-9]+}")
通过这种方式,我的控制器不会捕获 url localhost:8080/api/v1/creditTransfers/search
但是,如果我只重写 DELETE 方法,当我尝试 GET localhost:8080/api/v1/creditTransfers
时,我仍然遇到错误Request method 'GET' not supported
。似乎我的控制器覆盖了特定路径的所有方法,而不仅仅是我设置的那个。
您可以添加
@RestResource(exported=false)
关于您要在存储库中覆盖的方法。
如本 thread, and originally here 中所述,如果您使用 @RepositoryRestController
和 @RequestMapping
注释您的控制器,您将失去 Spring 生成 "default" 的好处适合您的 REST 端点。
防止这种情况的唯一方法,即同时获取自动生成的端点和您的自定义端点,是仅使用方法级请求映射:
@Api(tags = "CreditTransfer Entity")
@RepositoryRestController
@PreAuthorize("isAuthenticated()")
public class CreditTransferController {
@GetMapping("/api/v1/creditTransfers/{id}")
public ResponseEntity<?> findAll(@PathVariable("id") long id, HttpServletRequest request, Locale locale,
PersistentEntityResourceAssembler resourceAssembler) {
//my code
}
@DeleteMapping("/api/v1/creditTransfers/{id}")
public ResponseEntity<?> deleteMovement(@PathVariable("id") long id, HttpServletRequest request, Locale locale,
PersistentEntityResourceAssembler resourceAssembler) {
//my code
}
}
旁注:我还使用了映射快捷方式 GetMapping and DeleteMapping。
我正在使用 Spring Boot,Spring Data REST,Spring HATEOAS,Hibernate,JPA。
我在我的应用程序中广泛使用 Spring 数据 REST,并且公开了我的实体的所有存储库。 不幸的是,有些特殊情况并不那么容易管理。 其中之一是:
我有一个自定义控制器:
@Api(tags = "CreditTransfer Entity")
@RepositoryRestController
@RequestMapping(path = "/api/v1")
@PreAuthorize("isAuthenticated()")
public class CreditTransferController {
@RequestMapping(method = RequestMethod.GET, path = "/creditTransfers/{id}")
public ResponseEntity<?> findAll(@PathVariable("id") long id, HttpServletRequest request, Locale locale,
PersistentEntityResourceAssembler resourceAssembler) {
//my code
}
@RequestMapping(method = RequestMethod.DELETE, path = "/creditTransfers/{id}")
public ResponseEntity<?> deleteMovement(@PathVariable("id") long id, HttpServletRequest request, Locale locale,
PersistentEntityResourceAssembler resourceAssembler) {
//my code
}
这里的问题是覆盖这些端点,我隐藏了 Spring Data REST 创建的 /search 端点。这对我来说非常重要。
我没有找到任何聪明的方法来让它工作而不干扰 Spring Data REST 提供的默认端点。
有办法解决我的问题吗?
============================================= =========================
一个小的改进是使用这样的映射:
@RequestMapping(method = RequestMethod.DELETE, path = "/creditTransfers/{id:[0-9]+}")
通过这种方式,我的控制器不会捕获 url localhost:8080/api/v1/creditTransfers/search
但是,如果我只重写 DELETE 方法,当我尝试 GET localhost:8080/api/v1/creditTransfers
时,我仍然遇到错误Request method 'GET' not supported
。似乎我的控制器覆盖了特定路径的所有方法,而不仅仅是我设置的那个。
您可以添加
@RestResource(exported=false)
关于您要在存储库中覆盖的方法。
如本 thread, and originally here 中所述,如果您使用 @RepositoryRestController
和 @RequestMapping
注释您的控制器,您将失去 Spring 生成 "default" 的好处适合您的 REST 端点。
防止这种情况的唯一方法,即同时获取自动生成的端点和您的自定义端点,是仅使用方法级请求映射:
@Api(tags = "CreditTransfer Entity")
@RepositoryRestController
@PreAuthorize("isAuthenticated()")
public class CreditTransferController {
@GetMapping("/api/v1/creditTransfers/{id}")
public ResponseEntity<?> findAll(@PathVariable("id") long id, HttpServletRequest request, Locale locale,
PersistentEntityResourceAssembler resourceAssembler) {
//my code
}
@DeleteMapping("/api/v1/creditTransfers/{id}")
public ResponseEntity<?> deleteMovement(@PathVariable("id") long id, HttpServletRequest request, Locale locale,
PersistentEntityResourceAssembler resourceAssembler) {
//my code
}
}
旁注:我还使用了映射快捷方式 GetMapping and DeleteMapping。