具有Spring Data REST的自定义控制器隐藏默认端点

时间:2017-11-29 16:19:30

标签: java spring spring-mvc spring-boot spring-data-rest

我使用Spring Boot,Spring Data REST,Spring HATEOAS,Hibernate,JPA。

我在我的应用程序中广泛使用Spring Data 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]+}")

通过这种方式,我的控制器无法捕获网址localhost:8080/api/v1/creditTransfers/search,但是,如果我仅覆盖DELETE方法,当我尝试GET localhost:8080/api/v1/creditTransfers时,我发现了错误{{ 1}}。似乎我的控制器覆盖特定路径的所有方法,而不仅仅是我设置的方法。

2 个答案:

答案 0 :(得分:1)

正如本thread和原here中所述,如果您使用@RepositoryRestController AND @RequestMapping注释您的控制器,则会失去Spring生成“默认”的好处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
    }

}

附注:我还使用了映射快捷方式GetMappingDeleteMapping

答案 1 :(得分:0)

您可以添加

@RestResource(exported=false)

了解要在存储库中覆盖的方法。