位置: 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使用手册)

  • 荣耀X30max怎么设置免打扰(荣耀X30max怎么设置地震预警)

    荣耀X30max怎么设置免打扰(荣耀X30max怎么设置地震预警)

  • 华为m6怎么扩展内存(华为m6 扩展)

    华为m6怎么扩展内存(华为m6 扩展)

  • 探探解除匹配是单向吗(探探解除匹配是什么样的)

    探探解除匹配是单向吗(探探解除匹配是什么样的)

  • 抖音上传失败保存至草稿(抖音上传失败保存至草稿是不是封号了)

    抖音上传失败保存至草稿(抖音上传失败保存至草稿是不是封号了)

  • 拼多多的营销模式(拼多多的营销模式成功之处)

    拼多多的营销模式(拼多多的营销模式成功之处)

  • 手机电视剧怎么投屏到电视上(手机电视剧怎么样)

    手机电视剧怎么投屏到电视上(手机电视剧怎么样)

  • 润工作闪退怎么回事(闪退解决工具)

    润工作闪退怎么回事(闪退解决工具)

  • 华为手机怎么设置陌生号码打不进(华为手机怎么设置来电铃声)

    华为手机怎么设置陌生号码打不进(华为手机怎么设置来电铃声)

  • 华为play3怎么截屏(华为play3怎么截长图)

    华为play3怎么截屏(华为play3怎么截长图)

  • 快手注销后粉丝还在吗(快手刷关注)

    快手注销后粉丝还在吗(快手刷关注)

  • 路由器隐藏了怎么连接(路由器隐藏了怎么恢复手机)

    路由器隐藏了怎么连接(路由器隐藏了怎么恢复手机)

  • bm37是小米几的电池(bm49是小米中哪一款)

    bm37是小米几的电池(bm49是小米中哪一款)

  • 快手怎么查看钱包(怎么能查到快手花的钱)

    快手怎么查看钱包(怎么能查到快手花的钱)

  • 华为p30 6+128和8+128区别(华为p30,6+128多少钱)

    华为p30 6+128和8+128区别(华为p30,6+128多少钱)

  • 手机qq群标签怎么设置(qq群标签怎么写)

    手机qq群标签怎么设置(qq群标签怎么写)

  • 苹果涂鸦功能在哪里(苹果手机的涂鸦功能在哪里)

    苹果涂鸦功能在哪里(苹果手机的涂鸦功能在哪里)

  • 苹果手机微信小程序怎么放桌面(苹果手机微信小程序上面的音乐和音频怎么删除)

    苹果手机微信小程序怎么放桌面(苹果手机微信小程序上面的音乐和音频怎么删除)

  • 为什么ppt视频播放错误

    为什么ppt视频播放错误

  • boss直聘账号被锁定怎么办(Boss直聘账号被锁定申诉信息怎么写)

    boss直聘账号被锁定怎么办(Boss直聘账号被锁定申诉信息怎么写)

  • vivo手机hd2怎么关闭(vivo手机上的hd怎么弄)

    vivo手机hd2怎么关闭(vivo手机上的hd怎么弄)

  • ios12关闭软件下载密码(苹果手机关闭软件下载)

    ios12关闭软件下载密码(苹果手机关闭软件下载)

  • 联想手机如何截屏快捷键(联想手机如何截长屏)

    联想手机如何截屏快捷键(联想手机如何截长屏)

  • 电脑中毒了怎么办?(电脑中毒蓝屏了怎么办修复)

    电脑中毒了怎么办?(电脑中毒蓝屏了怎么办修复)

  • mac系统触控板手势大全(mac触控板使用技巧)

    mac系统触控板手势大全(mac触控板使用技巧)

  • Realsense D455/435内参标定以及手眼标定

    Realsense D455/435内参标定以及手眼标定

  • mkdosfs命令  建立DOS文件系统(mkisofs命令)

    mkdosfs命令 建立DOS文件系统(mkisofs命令)

  • 企业间无息借款合法吗
  • 房产税的计算方法举例说明
  • 政府补助是否可以抵扣税
  • 在建工程转固定资产需要交税吗
  • 含税价和不含税计算公式
  • 车辆购置税和车船税的区别在哪
  • 其他债权投资的汇兑差额计入什么科目
  • 工程物资什么时候结转到开发成本里面
  • 企业所得税申报时间
  • 非房产企业出售不动产需要缴纳增值税吗
  • 流动资产增幅
  • 珠宝属于什么行业领域
  • 房地产常用的付款方式有哪三种
  • 企业关联方利息支出税前扣除的标准扣除
  • 企业所得税公益性捐赠扣除标准
  • 长期待摊费用税前扣除
  • 某公司是一家刚成立的大型化妆品生产企业
  • 行业协会的作用定位
  • 工会的会费收入如何记账
  • 应收账款折扣怎么计算
  • 产权交易所怎么赚钱
  • 非正常损失允许税前扣除吗
  • 银行贷款利息是百分比还是千分比
  • 营改增后还有营业费用吗
  • excel自动计算增值税
  • 签发空头支票的赔偿金
  • 所得税报表里的资产总额在哪里取数
  • qq画画图片大全
  • 怎么关闭电量低
  • warning control
  • 弥补亏损的会计分录是怎样的
  • 鸿蒙系统怎样开启5G
  • php替换指定内容
  • 提供劳务收入怎么交税
  • php获取文件名
  • 重楼的功效与作用价格
  • PHP:imagesetthickness()的用法_GD库图像处理函数
  • thinkphp查询版本号
  • ai绘图素材
  • 注销报税是什么意思
  • chrome 浏览器插件开发
  • 研发 专利
  • 帝国cms对接小程序
  • 个人工程款收入算是工资流水吗
  • 固定资产可收回金额怎么算
  • mongodb skip limit
  • 银行账本怎么记账
  • 什么是增值?
  • 预扣预缴和汇算清缴是什么意思
  • 给客户买的礼品要交税吗
  • 收到股东投资如何做账
  • 预算收入包括增值税吗
  • 在建工程前期费用明细
  • 管理费用当月可以结转吗
  • 用友t3财务通普及版如何开下年账
  • 工程行业收到工程发票
  • 对公支付宝提现怎么取消
  • 科目余额表没有本年累计怎么办
  • 其他流动资产为什么包括应交增值税
  • 支付代理费计入什么科目
  • 海量数据的查询
  • ubuntu安装lnmp环境
  • windows的fn键
  • windowsxp怎么卸载
  • linux awk -v
  • rpm包安装位置
  • centos 编译安装
  • Centos 6.5 64位双网卡绑定教程
  • 在linux系统中创建用户账户
  • win7桌面图标靠右
  • ES6 javascript中class类的get与set用法实例分析
  • 欢迎使用本公司智能语音电动车
  • js原型继承和构造继承
  • nodejs的应用场景和优缺点
  • unity接sdk教程
  • unity3d 碰撞
  • eval()方法
  • 开源 android 播放器
  • python网络爬虫总结
  • 上海嘉定小学入学积分
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设