位置: IT常识 - 正文

Jmix 中 REST API 的两种实现(java rest接口)

编辑:rootadmin
你知道吗,在 Jmix 中,REST API 有两种实现方式! 很多应用是采取前后端分离的方式进行开发。这种模式下,对前端的选择相对灵活,可以根据团队的擅长技能选择流行的 Angular/React/Vue 之一,或者前端为App/小程序等手机应用。Jmix 的一种典型应用场景就是作为这种类型应用程 ...

推荐整理分享Jmix 中 REST API 的两种实现(java rest接口),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:rest java,rest接口调用java,rest.api,rest api java,rest接口调用java,rest java,rest js,rest js,内容如对您有帮助,希望把文章链接给更多的朋友!

你知道吗,在 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) @Id private 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 { @Autowired private DataManager dataManager; // 插入代码段时,默认注入带有权限检查的 DataManager public 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 服务 API

Jmix 服务(Service) API 可以将任意 Spring bean 作为 HTTP 接口开放。Jmix 负责 HTTP 交互,例如,提供 HTTP 响应编码、进行错误处理等。下图是 Jmix 服务 API 的流程图:

Jmix 中 REST API 的两种实现(java rest接口)

可以看到,作为应用程序开发者,仅需要编写服务代码。另外,还需做一些配置:

在项目的 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 也支持匿名访问。

Spring 控制器 API

然后我们再看看 Spring 的 RestController 方式。首先,我们定义一个控制器:

@RestController("sls_ProductController")@RequestMapping("/products")public class ProductController { @Autowired private ProductService productService; @GetMapping("priceunder") public List<Product> getPriceUnder(@RequestParam Double price) throws Throwable { if (price < 0) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "价格参数必须大于 0"); // 自定义控制器层的参数检查,抛出请求异常。 } return productService.getProductsCheaperThan(price); }}

Jmix 中的控制器接口默认都是匿名的,但是为匿名用户配置能访问实体信息又不够安全,Jmix 提供了一个应用程序属性,支持使用 Jmix 安全机制对自定义控制器进行保护:

# 支持逗号分隔的多个 patternjmix.rest.authenticatedUrlPatterns=/products/**

然后,重启服务就可以通过 Postman 进行调用。注意,这里的 URL 与服务 URL 不同,直接使用了控制器中定义的路径:

结论

通过上面的代码,我们可以看到,在 Jmix 中使用两种类型的 REST API 其实都不复杂,但是,也是各有优势:

Jmix 服务 API:

不用编写控制器代码,仅通过 XML 配置即可使用默认使用 Jmix 的安全机制可以使用 Fetch plan 定义返回实体的字段

Spring 控制器:

更加灵活,可以使用 Spring 控制器自定义 HTTP 状态码、响应类型或者异常错误除了使用服务层的实体控制外,还可以在控制器层使用自定义的 DTO 对返回实体的信息做进一步控制

因此,在大多数情况下,我们仅使用 Jmix 的服务 API 就能够满足使用要求。针对部分复杂场景可以使用 Spring 控制器 API。

文中使用的 Jmix 版本:1.3.1

本文链接地址:https://www.jiuchutong.com/zhishi/304524.html 转载请保留说明!

上一篇:VMware Workstation Pro 16 安装教程(vmware workstation pro怎么卸载干净)

下一篇:帝国cms怎么加广告(帝国cms使用手册)

  • 如何做好拍拍网店推广?(如何做好拍拍网营销)

    如何做好拍拍网店推广?(如何做好拍拍网营销)

  • 苹果原相机网格线怎么打开(苹果原相机网格怎么打开)

    苹果原相机网格线怎么打开(苹果原相机网格怎么打开)

  • 微信朋友圈话题带井号怎么发(微信朋友圈话题标签怎么弄)

    微信朋友圈话题带井号怎么发(微信朋友圈话题标签怎么弄)

  • 苹果x怎么导入卡里的联系人(苹果x怎么导入动态壁纸)

    苹果x怎么导入卡里的联系人(苹果x怎么导入动态壁纸)

  • 如何看陌生人的微信朋友圈(如何看陌生人的共同好友)

    如何看陌生人的微信朋友圈(如何看陌生人的共同好友)

  • 抖音第一个视频多少播放量正常(抖音第一个视频应该怎么发)

    抖音第一个视频多少播放量正常(抖音第一个视频应该怎么发)

  • 微信多久不登录会被冻结(微信多久不登录会被限制登录)

    微信多久不登录会被冻结(微信多久不登录会被限制登录)

  • 快捷指令中心连不上网(快捷指令中心连不上)

    快捷指令中心连不上网(快捷指令中心连不上)

  • 12306短信发送失败(发送短信到12306失败)

    12306短信发送失败(发送短信到12306失败)

  • 苹果6plus截屏快捷键(苹果6plus截屏快捷键怎么设置)

    苹果6plus截屏快捷键(苹果6plus截屏快捷键怎么设置)

  • 华为nova7用什么系统(华为nova7用什么处理器)

    华为nova7用什么系统(华为nova7用什么处理器)

  • 华为mate30pro锁屏时间位置在哪(华为mate30pro锁屏步数怎么关闭)

    华为mate30pro锁屏时间位置在哪(华为mate30pro锁屏步数怎么关闭)

  • 引导式访问有什么作用(引导式访问有什么好处)

    引导式访问有什么作用(引导式访问有什么好处)

  • 三星g9880是什么型号(三星g9880怎么样)

    三星g9880是什么型号(三星g9880怎么样)

  • 网易云音乐定时在哪里(网易云音乐定时关闭智能模式)

    网易云音乐定时在哪里(网易云音乐定时关闭智能模式)

  • 荣耀20怎样关闭后台运行(荣耀20怎样关闭智慧推荐)

    荣耀20怎样关闭后台运行(荣耀20怎样关闭智慧推荐)

  • m06是什么指令(M06是什么指令)

    m06是什么指令(M06是什么指令)

  • 华为荣耀play3怎么截屏(华为荣耀play3怎么开小窗口)

    华为荣耀play3怎么截屏(华为荣耀play3怎么开小窗口)

  • 一个人可以集几套五福(一个人可以集几个五福卡)

    一个人可以集几套五福(一个人可以集几个五福卡)

  • ipad怎么隐藏图标(ipad怎么隐藏图库)

    ipad怎么隐藏图标(ipad怎么隐藏图库)

  • vivo手机双卡双待设置(vivo手机双卡双待怎么设置)

    vivo手机双卡双待设置(vivo手机双卡双待怎么设置)

  • opp0手机如何强制关机(oppo怎么强起)

    opp0手机如何强制关机(oppo怎么强起)

  • 小米4c电视能用语音吗(小米4c电视支持wifi吗)

    小米4c电视能用语音吗(小米4c电视支持wifi吗)

  • 雷电3接口能干嘛(雷电3接口很重要吗)

    雷电3接口能干嘛(雷电3接口很重要吗)

  • 一加手机有语音助手吗(一加手机有语音助理吗)

    一加手机有语音助手吗(一加手机有语音助理吗)

  • 手机被轰炸了有没有办法解决(手机被轰炸了有影响吗)

    手机被轰炸了有没有办法解决(手机被轰炸了有影响吗)

  • iphone充电宝充不进电(iphone充电宝充不进电,然后猛增)

    iphone充电宝充不进电(iphone充电宝充不进电,然后猛增)

  • win10桌面没有我的电脑怎么办(win10桌面没有我的电脑图标怎么办)

    win10桌面没有我的电脑怎么办(win10桌面没有我的电脑图标怎么办)

  • C++ 使用STL string 实现的split,trim,replace修订(C++ 使用dll路径不在当前路径时如何调用)

    C++ 使用STL string 实现的split,trim,replace修订(C++ 使用dll路径不在当前路径时如何调用)

  • 一般纳税人开劳务发票几个点
  • 销项税额是指
  • 解除劳动合同支付违约金合法吗
  • 主营业务税金及附加怎么算
  • 政府补助是属于什么财务活动
  • 休产假个人部分社保公司怎么做账
  • 股权转让开票怎么做账
  • 现在会计账簿还需要交印花税吗
  • 互联网公司如何盈利
  • 企业防伪税控维护方案
  • 固定资产转在建工程
  • 事业单位专项资金的管理要求
  • 委托加工农产品的扣除率
  • 固定资产进项税额
  • 税控盘上开完发票发的邮件在哪查看
  • 劳务费增值税发票是劳务单位开吗
  • 发票的单价开得太低了怎么办?
  • 小规模纳税人普票可以开3%吗
  • 毛利润率的计算公式举例
  • 公司帮员工买的保险
  • 科技型企业科研项目申报
  • 推广的产品
  • 职工福利费扣除率是多少
  • 新准则待摊费用
  • windows7部分的更新安装失败怎么办?
  • Thinkphp5+PHPExcel实现批量上传表格数据功能
  • key是什么文档
  • php 字符串函数
  • firefox有什么用
  • 企业确认坏账损失时的会计分录为
  • vue antdesign
  • vite + vue + ts 自动按需导入 Element Plus组件,并如何解决按需引入后ElMessage与ElLoading 的问题(找不到名称“ElMessage”问题。)
  • php编写用户注册界面
  • 金融企业呆账核销管理办法
  • 公司报亏损需要交税吗
  • centos 安装php
  • 学生个人网页制作html5
  • 已用短信息服务发送信息,对方能收到吗
  • route命令的作用
  • yii2框架漏洞
  • 增值税普通发票查询真伪
  • 异地预缴个人所得税账务技巧
  • python中变量类型有几种
  • 开票钱收不回怎么办
  • 建造合同收入的会计处理
  • 资本公积的会计处理方法
  • 建筑租赁公司是什么意思
  • 增值税及附加税费申报表附列资料一
  • 汇算清缴补缴所得税的报税利润表怎么报
  • 开发成本的会计科目编码
  • 劳务合同如果不发工资怎么办
  • 先前收取的包装费用
  • 公司购入的财务会计分录
  • 企业收到退回的银行汇票多余款项
  • 债权投资的交易费用计入成本还是利息调整
  • 租地青苗补偿问题
  • 未摊销的费用怎样处理
  • 机关和事业单位党的支部委员会每届任期
  • 公司员工住宿费标准
  • 财付通交易手续费多少
  • 成品油 规定
  • 会计账簿的更换和保管有哪些要求
  • mysql修改表结构的命令
  • mysql重置初始密码
  • win10系统资源
  • 深入剖析典型案例
  • 生成器作用
  • qt opengl obj
  • toolkit:eclipse导入下载好的android系统源码
  • 教女朋友学英语
  • 苹果多点触控
  • jquery onready
  • unity3d功能介绍
  • unity 3d 介绍
  • 浦东经济开发区官网
  • 登录上海电子税务局单位社保查询不到当月未交的
  • ca登录的用户名和密码分别是什么
  • 税务干部提升工作能力
  • 2019年汽车购置税
  • 山西省税务局网站系统维护公告
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设