关于Spring Data Rest的一些总结

34234462745aae3584a0758946e3c1a5.jpeg

背景介绍

最近一直在开发一些基于 Spring Data REST 的项目。在此过程中,随着开发工作的不断深入,对 Spring Data REST 的了解也越来越深。享受着 Spring Data REST 带来的便捷,也忍受着它带来的不便。

Spring Data REST 是什么

Spring Data REST 的目标是提供坚实的基础,从而使用 HTTP REST 语义来开放 CRUD 操作到你的 JPA 库管理的实体。

功能特性

Spring Data REST 提供了一系列的功能特性,来帮助开发者减少重复工作:

  • 使用HAL作为媒体类型为您的域模型公开一个可发现的REST API

  • 公开表示模型的集合、项和关联资源

  • 通过导航链接支持分页

  • 允许动态筛选集合资源

  • 公开存储库中定义的查询方法的专用搜索资源

  • 允许通过处理Spring ApplicationEvents挂钩到REST请求的处

  • 公开有关被发现的模型的元数据,如ALPS和JSON Schema

  • 允许通过投影定义客户特定的表示

  • 发布了一个定制的HAL浏览器变体来利用公开的元数据

  • 目前支持JPA、MongoDB、Neo4j、Solr、Cassandra、Gemfire

  • 允许对公开的默认资源进行高级自定义

适用场景

在实际的开发过程中,总结出了一些 Spring Data REST 的适用场景:

  • 增删改查的简单业务逻辑

  • 前端数据和表结构内容对应

  • 不含有复杂的关联查询

复杂化

在使用过程中,发现一些实际开发中的常见的需求,在使用 Spring Data REST 后,实现起来变得复杂了许多。

拦截器

使用 Spring Data REST 后,按通用方式下配置的拦截器不生效,无法拦截住 Spring Data REST 提供的 Restful。需要特殊配置:

@Bean
public MappedInterceptor myMappedInterceptor() {
    return new MappedInterceptor(new String[]{"/**"}, new String[]{},  testInterceptor());
}

数据加工

如果数据保存之前需要特殊处理,对数据进行加工,就需要使用 ApplicationEvents 方式来处理:

@Component
public class BeforeCreateEventListener {
    @EventListener
    public void onBeforeCreateEvent(BeforeCreateEvent event) {
        Object source = event.getSource();
        if (source instanceof RelatedTransaction) {
            RelatedTransaction relatedTransaction = (RelatedTransaction) source;
            if (relatedTransaction.getCreateDateTime() == null) {
                relatedTransaction.setCreateDateTime(new Date());
            }
            if (relatedTransaction.getState() == null) {
                relatedTransaction.setState(StateEnum.PRE_SUBMIT);
            }
        } else if (source instanceof RelatedProject) {
            RelatedProject relatedProject = (RelatedProject) source;
        }else if (source instanceof RelatedCompany){
            RelatedCompany relatedCompany = (RelatedCompany) source;
            if (relatedCompany.getCreateDateTime() == null) {
                relatedCompany.setCreateDateTime(new Date());
            }
        }
    }
}

所有模型的数据创建都会发布 BeforeCreateEvent,所以在处理数据时就需要对数据类型进行判断。这种情况下,很容易就会将多个模型的数据加工的处理逻辑耦合到一起。

在保存数据时,提供了 Event 供开发者处理数据,但是在查询数据的时候却没有提供相应的数据处理机制,所有对于 VO 数据的加工,开发者就没办法使用 Spring Data REST 了。

JPA

Spring Data REST 是基于 Spring Data JPA 实现的,而 Spring Data JPA 底层的 ORM 是 hibernate 。就像网上大多数言论一样,hibernate 太复杂了,尤其在处理自定义 SQL 的关联查询时,让开发者感觉无从下手。

文档少

这里说的文档少指的是关于 Spring Data REST 和 Spring Data JPA 国内的文档太少了。在国内互联网推崇了 Mybatis 之后,国内的博客、网站到处都充斥着 Mybatis 的帮助文档,问题解决方案。

总结

在软件开发领域里,没有银弹,每一种技术、一种框架都有它自己的适用场景。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值