当前位置: 首页 > 知识库问答 >
问题:

带有Spring Data REST的自定义控制器隐藏默认endpoint

冉永宁
2023-03-14

我正在使用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
    }

这里的问题是,覆盖这些endpoint时,我隐藏了Spring Data REST创建的/searchendpoint。这对我很重要。

一个小的增强是使用如下所示的映射:

@RequestMapping(method = RequestMethod.DELETE, path = "/creditTransfers/{id:[0-9]+}")

这样,我的控制器就不会捕获urllocalhost:8080/api/v1/credittransfers/search,但如果我只是重写了DELETE方法,那么当我尝试get localhost:8080/api/v1/credittransfers时,我会出现错误request method'get'not supported。似乎我的控制器覆盖了特定路径的所有方法,而不仅仅是我设置的路径。

共有1个答案

令狐晟
2023-03-14

正如本文所解释的,如果您使用@repositoryrestcontroller@requestmapping注释您的控制器,那么您就失去了Spring为您生成“默认”RESTendpoint的好处。防止这种情况的唯一方法(即同时获取自动生成的endpoint和自定义endpoint)是仅使用方法级requestmapping:

@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和deletemapping。

 类似资料:
  • 我尝试用自定义控制器制作一个自定义组件。自定义组件已经显示在应用程序上,但我未能向其添加属性。 项目结构: null 布尔马尔科 完全错误: 原因:java.lang.nullPointerException:无法调用“javafx.scene.image.imageeview.setimage(javafx.scene.image.image)”,因为“controller.topbarbtn.

  • 问题内容: 考虑以下情况, 在上面的例子中我得到以下输出这是 相当 期待。 我一直在阅读有关默认方法的信息, 尤其是 关于扩展包含默认方法的接口的信息 2 第二子弹:重新声明的默认方法,这使得它的抽象。 在上面的示例中,我有两个接口的默认方法具有相同的名称,并且当我实现这两个接口时,我只能实现对的引用。 我对此几乎没有疑问, 我怎样才能 到达 的方法 和 如果我不能比,为什么? 没有这种行为从本质

  • 我觉得显示/隐藏是一个相当常见的范例,最常见的是,具体取决于业务逻辑。我的问题是,使用自动布局响应隐藏视图的最佳方式是什么,就好像它们的框架是0x0一样。这是一个1-3个功能的动态列表示例。 现在我有一个10px的顶部空间,从按钮到最后一个标签,当标签被隐藏时,它显然不会向上滑动。现在,我创建了这个约束的出口,并根据显示的标签数量修改常量。这显然有点麻烦,因为我使用负常量值将按钮推到隐藏帧上。这也

  • 控制器定义 ThinkCMF5的控制器完全按 TP5的控制器用法来,但 CMF 封装了几个重要控制器基类,为了更方便开发者,我们建议如果没有特殊需求,自己创建的控制器请最好继承一个基类控制器; 用于 WEB 项目的基类控制器有四个,分别是:BaseController,HomeBaseController,UserBaseController,AdminBaseController 继承关系 th

  • 控制器定义 ThinkCMF6.0的控制器完全按 TP6.0的控制器用法来,但 CMF 封装了几个重要控制器基类,为了更方便开发者,我们建议如果没有特殊需求,自己创建的控制器请最好继承一个基类控制器; 用于 WEB 项目的基类控制器有四个,分别是:BaseController,HomeBaseController,UserBaseController,AdminBaseController, Re

  • 控制器定义 控制器文件通常放在application/module/controller下面,类名和文件名保持大小写一致,并采用驼峰命名(首字母大写)。 一个典型的控制器类定义如下: <?php namespace app\index\controller; use think\Controller; class Index extends Controller { public fu