Spring Boot - 创建泛型存储库

2024-02-20

我的 Web 应用程序中有许多服务执行经典的 CRUD 操作,这些是参数部分。为了避免为每个实体类创建一个存储库接口,我想创建一个通用存储库。我尝试了下面的代码,但只有当我有一个控制器时才有效。

public class BaseController<T extends BaseEntity> {

    @Autowired
    protected JpaRepository<T, Integer> dao;
}
@RestController
@RequestMapping("matieres")
@Api(value = "Matieres", tags = {"Parametrages"})
public class MatiereController extends BaseController<Matiere> {

    @GetMapping
    public Page<Matiere> find(
            @RequestParam(defaultValue = "0", required = false, name="page") Integer page,
            @RequestParam(defaultValue = "20", required = false, name="size") Integer size) {
        return this.dao.findAll(PageRequest.of(page, size));
    }

    @PostMapping
    public ResponseEntity<Matiere> create(@RequestBody Matiere matiere) {
        return ResponseEntity.ok(this.dao.save(matiere));
    }
}

除非您将存储库注册为 Spring beans,否则 Spring 无法使用它们。所以首先你应该创建存储库接口(

public interface UserRepo extends JpaRepository<User, Long> {}

public interface PersonRepo extends JpaRepository<Person, Long> {}

但有一个好消息 - 您可以仅在抽象控制器中实现所有典型(CRUD)方法,例如:

public abstract class AbstractController<T> {

    protected final JpaRepository<T, Long> repo;

    public AbstractController(JpaRepository<T, Long> repo) {
        this.repo = repo;
    }

    @GetMapping
    public List<T> getAll() {
        return repo.findAll();
    }

    @GetMapping("/{id}")
    public ResponseEntity getOne(@PathVariable("id") Long id) {
        return repo.findById(id)
                .map(ResponseEntity::ok)
                .orElse(ResponseEntity.notFound().build());
    }

    @PostMapping
    public T create(@RequestBody T entity) {
        return repo.save(entity);
    }

    @PatchMapping("/{id}")
    public ResponseEntity update(@PathVariable("id") Long id, @RequestBody T source) {
        return repo.findById(id)
                .map(target -> { BeanUtils.copyProperties(source, target, "id"); return target; })
                .map(repo::save)
                .map(ResponseEntity::ok)
                .orElse(ResponseEntity.notFound().build());
    }

    @DeleteMapping("/{id}")
    public ResponseEntity delete(@PathVariable("id") Long id) {
        return repo.findById(id)
                .map(entity -> { repo.delete(entity); return entity; })
                .map(t -> ResponseEntity.noContent().build())
                .orElse(ResponseEntity.notFound().build());
    }
}

然后只需注册您的具体控制器即可与所有实体一起使用:

@RestController
@RequestMapping("/people")
public class PersonController extends AbstractController<Person> {
    public PersonController(PersonRepo repo) {
        super(repo);
    }
}
@RequestMapping("/users")
public class UserController extends AbstractController<User> {
    public UserController(UserRepo repo) {
        super(repo);
    }
}

Demo: sb-通用控制器演示 https://github.com/Cepr0/sb-generic-controller-demo.

附:当然,这段代码有一个演示目的。在实际项目中,您应该将业务逻辑移至事务服务层。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot - 创建泛型存储库 的相关文章

随机推荐

  • 为什么 Android 在我的 SpinnerAdapter 中回收了错误的视图类型?

    我正在尝试制作一个带有分隔符的 ActionBar 微调器 我已经实施了一个SpinnerAdapter有 2 种项目视图类型 感谢getViewTypeCount 问题是我被发送了一些convertViews来自其他类型 这是我的 Spi
  • 从 P 帧和 B 帧创建 I 帧

    我编写了一个基于 FFMpeg 的 C 转换器 它可以接收 hls stream 的链接并将其转换为本地 mp4 视频 到目前为止 一切都很好 转换器工作起来就像一个魅力 对此没有任何疑问 PROBLEM 无论我向转换器提供什么输入源 在转
  • 如何限制单个Linux进程的内存使用而不杀死该进程

    如何限制单个 Linux 进程的内存使用而不杀死该进程 我知道 ulimit 可以限制内存使用 但如果超过限制 将会杀死进程 是否有其他命令或 shell 可以限制内存使用而不杀死进程 除此之外还有另一种方式设置限制 http man7 o
  • 尽管使用了 @Primary,但两个同名的 bean 仍会导致 ConflictingBeanDefinitionException

    我有一个应用程序初始值设定项类 用于将应用程序特定数据插入到数据库中 Component applicationInitializer public class ApplicationInitializer PostConstruct pu
  • 如何向标准信号处理程序添加代码?

    我有一个在 Linux 上运行的 C 应用程序 我需要向标准信号处理程序添加一些代码 我的想法是设置我的处理程序 将指针保存到标准处理程序 并从我的代码中调用保存的处理程序 不幸的是 signal 和 sigaction 都没有返回指向标准
  • 如何使用 Erlang/OTP 25 编译器重新编译 rebar3?运行灵药 1.13.4

    我正在关注免费的截屏视频 教程凤凰城 LiveView 启动器 https online pragmaticstudio com courses liveview starter modules 2但我什至无法开始 因为mix setup失
  • 逐行过滤输入流

    我正在从 Amazon S3 检索大型 gzip 压缩文件 我希望能够即时转换这些文件的每一行并将输出上传到另一个 S3 存储桶 上传 API 需要一个InputStream https docs aws amazon com AWSJav
  • 用鼠标拖动无边框窗口形式[重复]

    这个问题在这里已经有答案了 可能的重复 C 使无边框表单可移动 https stackoverflow com questions 1592876 c sharp make a borderless form movable 我通过设置在
  • IE11通过javascript检测兼容性视图是否打开

    有谁知道当我通过 javascript 访问网站时如何检查 IE 11 兼容模式是否打开 我将 url 添加到列表兼容性视图设置中 但当我这样做时 navigator userAgent 在开发者工具中 它返回 Mozilla 5 0 Wi
  • 如何建立 FTP 连接?

    我正在尝试使用 iPhone iPad 模拟器 Xcode 设置 FTP 连接 到目前为止 我发现我需要使用 CFFTP API 但我没有成功 我浏览了网络 最终遵循了我认为最清楚的内容 即 http developer apple com
  • MySQL服务器“正在读取初始通信数据包”,系统错误:111 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我将我的网站移至戈达迪服务器 但是即使进行了足够的更改 SQL 连接也无法工作 而之前工作得很好
  • FormsAuthenticationTicket.expiration v web.config 值超时

    这是一个 MVC2 网站 我在 FormsAuthentication 票证方面遇到问题 用户超时30分钟后无法重新登录 在测试期间 DateTime Now AddMinutes 30 值设置为 5000 一切正常 但现在已更改为 30
  • 如何为 Swagger UI 定义 [FromQuery] 参数的默认值?

    我有一个行动 HttpGet Route foo public ActionResult Foo FromQuery MyClass request var image ToImage WidgetType MedianSalesPrice
  • 什么是以及如何从我的数据库中删除表空间错误? [复制]

    这个问题在这里已经有答案了 由于负载脱落问题 我的数据库中的一张表已损坏 我删除了该表 现在我想再次创建该表 我明白了error 错误 1813 表 的表空间zorkif sys user accounts 存在 请在导入之前丢弃表空间 S
  • 如何/在哪里定义 Xcode 中的 App ID 前缀?

    作为一名新的 iOS 开发人员 我尝试为我的应用程序定义 Bundle Seed ID 应用程序 ID 前缀 Xcode 中如何 在哪里定义 Bundle Seed ID 应用程序 ID 前缀 请提供详细步骤 链接在这里 https dev
  • 在设计模式下显示带有自定义控件的 WinForm 时出错

    我有一个属于类库一部分的用户控件 我从我的解决方案中引用了这个项目 这会将引用项目中的控件添加到我的工具箱中 我将控件添加到表单中 一切看起来都不错 我编译并运行 完美的 但是当我关闭带有控件的 frm 并重新打开它时 出现此错误 代码继续
  • nsdictionary 中的块?

    因此 我将块操作存储到 nsmutabledictionary 中 然后在 Websocket 上返回响应时调用它们 这会将异步请求转换为块语法 这是精简的代码 void sendMessage NSString message respo
  • Gradle compileKotlin includeRuntime 未将运行时添加到 jar

    我有一个 Kotlin Gradle 项目 我想在 jar 文件中包含 Kotlin 的运行时和 stdlib 我目前正在使用它 但当我使用 build gradle 配置构建项目时 它不包括运行时或 stdlib compileKotli
  • 不循环C++计算数字的位数

    我必须计算一个数字的位数 我将数字除以 10 直到得到 0 每次迭代都会递增计数器 int num cin gt gt num while num gt 0 counter num num 10 挑战不在于使用任何循环或递归 而只是使用if
  • Spring Boot - 创建泛型存储库

    我的 Web 应用程序中有许多服务执行经典的 CRUD 操作 这些是参数部分 为了避免为每个实体类创建一个存储库接口 我想创建一个通用存储库 我尝试了下面的代码 但只有当我有一个控制器时才有效 public class BaseContro