你知道吗,在 Jmix 中 , REST API 有两种实现方式!
很多应用是采取前后端分离的方式进行开发 。这种模式下,对前端的选择相对灵活,可以根据团队的擅长技能选择流行的 Angular/React/Vue 之一,或者前端为App/小程序等手机应用 。Jmix 的一种典型应用场景就是作为这种类型应用程序的高级别管理 UI 和后端 。为此,Jmix 提供了强大的通用 REST API 功能 , 支持包括开箱即用的实体、文件、元数据、用户会话的 API 以及经过简单配置就能支持的业务逻辑(服务)REST API 。
由于 Jmix 是基于 Spring Boot 框架,因此也支持 Spring 的 RestController
。那么对于 Spring 的 REST API 机制和 Jmix 提供机制 , 究竟有什么不同,而我们在开发时又该如何选择呢?本文将通过具体的代码示例,介绍这两种 API 的区别,相信看完之后 , 该如何选择您心里应该有数了 。
数据模型和服务我们假设一个简单的场景,为了给用户提供凑单功能,我们在后端写一个服务用于查询低于某个价格的产品(Product
) , 并将满足条件的产品列表返回给客户端 。
数据模型首先我们构建一个简单的 JPA 实体:Product
类,包含名称和价格两个属性:
@JmixEntity@Table(name = "SLS_PRODUCT")@Entity(name = "sls_Product")public class Product {@JmixGeneratedValue@Column(name = "ID", nullable = false)@Idprivate UUID id;@InstanceName@Column(name = "NAME")private String name;@Column(name = "PRICE")private Double price;... // 其他属性}
实体通过 Jmix Studio 创建可以选择其他实体特性,比如版本、实体审计、软删除属性等 。服务可以像普通 Spring Boot 应用那样 , 自己手动创建一个
@Service
类 。也可以通过 Jmix Studio 提供的创建 bean 的功能创建 Service 。这里我们用 Jmix Studio 创建一个 Bean , 该功能默认创建带 @Component
注解的类,我们手动将类注解修改为 @Service
:@Service("sls_ProductService")public class ProductService {@Autowiredprivate DataManager dataManager; // 插入代码段时,默认注入带有权限检查的 DataManagerpublic List<Product> getProductsCheaperThan(Double price){// 注意 , 这里我们并没有对输入参数 price 做检查List<Product> productList = dataManager.load(Product.class).query("select p from sls_Product p " +"where p.price < :priceInput").parameter("priceInput", price).list();return productList;}}
这里的加载实体列表代码,我们通过 Studio 的代码段功能自动添加 。服务中,我们使用了 Jmix 的
DataManager
和 JPQL 查询语句加载实体 , 并使用方法的输入参数作为 JPQL 的参数 。Jmix 的持久层也支持 Spring Data Repository 或者 MyBatis 。而使用 DataManager
的一个好处是可以利用 Jmix 的安全机制,控制 API 调用方对实体的访问权限 。Jmix 服务 APIJmix 服务(Service) API 可以将任意 Spring bean 作为 HTTP 接口开放 。Jmix 负责 HTTP 交互,例如 , 提供 HTTP 响应编码、进行错误处理等 。下图是 Jmix 服务 API 的流程图:
文章插图
可以看到,作为应用程序开发者,仅需要编写服务代码 。另外,还需做一些配置:
- 在项目的 resources 目录添加 rest-services.xml,用于配置可作为 REST API 使用的服务及其方法 , 内容如下:
<?xml version="1.0" encoding="UTF-8"?><services xmlns="http://jmix.io/schema/rest/services"><service name="sls_ProductService"> <!-- 指定服务名称 --><method name="getProductsCheaperThan"> <!-- 指定方法名称 --><param name="price" type="java.lang.Double"/> <!-- 指定方法参数和类型 --></method><!-- 可以添加服务中其他方法 --></service><!-- 可以添加其他服务 --></services>
- 在项目的
application.properties
文件中,设置jmix.rest.services-config
参数,指定上面配置的 xml 文件:
jmix.rest.services-config = com/abmcode/sales/rest-services.xml
完成这些配置之后,就可以通过 REST 客户端调用了,URL 为 /rest/services/<service_name>/<method_name>
。例如,通过 Postman 调用:文章插图
服务 API 会默认使用 Jmix 的安全机制:API 端口需要使用认证 token 进行访问,而且用户需要有访问 REST API 和所查询实体的权限 。另外,Jmix 的服务 API 也支持匿名访问 。推荐阅读
- 迷你世界中的车要如何制作(迷你世界里的车如何制作)
- Python中dataclass库
- 国产三轮摩托车排名前十名-中国三轮摩托车排行榜
- 抖音中怎么和短视频中的人进行合拍(抖音无缝合拍突然没有是什么原因)
- 国内大型钢铁厂综合实力排名 中国钢厂实力排名
- 中国数字化是怎么转型成新范式TOP 50的?
- 中小制造企业需要ERP和MES吗?
- 如何通过 Java 代码隐藏 Word 文档中的指定段落
- Monaco Editor 中的 Keybinding 机制
- k8s 中 Pod 的控制器