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

  • 小朋友兔子发型(xp要停止服务了)(儿童小兔子发型编发)

    小朋友兔子发型(xp要停止服务了)(儿童小兔子发型编发)

  • 红米k40nfc怎么录入门禁卡(红米k40nfc怎么录入身份证)

    红米k40nfc怎么录入门禁卡(红米k40nfc怎么录入身份证)

  • 微信设置朋友圈权限后对方会知道吗(微信设置朋友圈签名)

    微信设置朋友圈权限后对方会知道吗(微信设置朋友圈签名)

  • iOS13电池优化是打开还是关掉(ios13优化电池充电多久学会)

    iOS13电池优化是打开还是关掉(ios13优化电池充电多久学会)

  • 手机老显示请检查网络设置怎么办(手机老显示检测到充电口有水)

    手机老显示请检查网络设置怎么办(手机老显示检测到充电口有水)

  • ipad微信怎么发送消息(iPad微信怎么发原图)

    ipad微信怎么发送消息(iPad微信怎么发原图)

  • ipad air2支持多少w快充(ipad air2支持多少w充电)

    ipad air2支持多少w快充(ipad air2支持多少w充电)

  • 屏幕老化是什么样的(屏幕老化是什么意思)

    屏幕老化是什么样的(屏幕老化是什么意思)

  • 三星微信黑暗模式怎么设置(三星微信黑暗模式)

    三星微信黑暗模式怎么设置(三星微信黑暗模式)

  • home键失灵的原因(home键不好使了)

    home键失灵的原因(home键不好使了)

  • autocad主要应用的领域是(autocad主要应用于)

    autocad主要应用的领域是(autocad主要应用于)

  • b站音频区在哪(b站音频区在哪里)

    b站音频区在哪(b站音频区在哪里)

  • 如何在淘宝上卖自己的产品(如何在淘宝上卖号)

    如何在淘宝上卖自己的产品(如何在淘宝上卖号)

  • 拼多多会员名怎么看(拼多多会员名怎么修改)

    拼多多会员名怎么看(拼多多会员名怎么修改)

  • 怎么拒收拼多多短信(怎么拒收拼多多快递包裹已经放驿站了)

    怎么拒收拼多多短信(怎么拒收拼多多快递包裹已经放驿站了)

  • 华为荣耀20屏幕(华为荣耀20屏幕分辨率)

    华为荣耀20屏幕(华为荣耀20屏幕分辨率)

  • 怎么把低速内存卡升级(低内存管理怎么调最好)

    怎么把低速内存卡升级(低内存管理怎么调最好)

  • 微软雅黑可以商用吗(微软雅黑商用授权)

    微软雅黑可以商用吗(微软雅黑商用授权)

  • qq怎么看别人把我删了(qq怎么看别人把你设为特别关心)

    qq怎么看别人把我删了(qq怎么看别人把你设为特别关心)

  • 能通过微信号查抖音吗(能通过微信号查到什么)

    能通过微信号查抖音吗(能通过微信号查到什么)

  • 安卓手机怎么设置动态壁纸(安卓手机怎么设置陌生号码打不进来)

    安卓手机怎么设置动态壁纸(安卓手机怎么设置陌生号码打不进来)

  • 闲鱼开店要钱吗(闲鱼开店要钱吗安全吗)

    闲鱼开店要钱吗(闲鱼开店要钱吗安全吗)

  • 360主板与365主板的区别(360主板哪个好)

    360主板与365主板的区别(360主板哪个好)

  • gioneegn8003什么型号(gioneegn8002s是什么型号)

    gioneegn8003什么型号(gioneegn8002s是什么型号)

  • 手机版qq音乐怎么剪歌(手机版QQ音乐怎么发布MV)

    手机版qq音乐怎么剪歌(手机版QQ音乐怎么发布MV)

  • 无线路由器1、2、3根天线有什么区别(无线路由器1200m覆盖范围)

    无线路由器1、2、3根天线有什么区别(无线路由器1200m覆盖范围)

  • Web自动化之Selenium常用操作(web自动化selenium实战项目)

    Web自动化之Selenium常用操作(web自动化selenium实战项目)

  • vue在html标签 {{}} 中调用函数的方法(vue项目内html)

    vue在html标签 {{}} 中调用函数的方法(vue项目内html)

  • 会计新手如何学会收款流程
  • 海关缴款书上完税怎么办
  • 明股实债的风险与防范
  • 未开票收入如何红冲
  • 结转本月完工入库产品制造成本,甲产品800台全部完工
  • 个人劳务费怎么交税
  • 资产负债表固定资产清理怎么填
  • 机票抵进项税税率
  • 应收账款属于非流动资产吗
  • 工资核算方式
  • 房产税逾期未申报罚款多少
  • 退回的留抵增值税怎么入账
  • 减免增值税后附加税还用计提吗
  • 技术服务年费是什么
  • 地质勘察费用应由谁支付
  • 购销合同印花税怎么算
  • 货运代理公司可以开运输费发票吗
  • 契税可以银行转让吗
  • 变更财务负责人在网上变更流程
  • 营改增后房地产开发税费一览表
  • 职工教育经费的扣除标准是什么
  • 高速公路抵税
  • 增票丢失怎么开完税证明
  • 一般纳税人的兼职合法吗
  • 企业发放防暑降温物品依据
  • 个体户收入总额是含税还是不含税
  • 企业间借款利息账务处理
  • 抄报汇总对比通用怎么写
  • 地方教育附加可以在企业所得税前扣除吗
  • 职工的经济补偿金是优先债权吗
  • 电脑隐藏软件图标快捷键
  • 文档自动填写怎么弄
  • macOS 11 Big Sur 开发者预览版 Beta 7正式推送
  • PHP:pg_untrace()的用法_PostgreSQL函数
  • php生成csv文件
  • lsalss.exe
  • 红宝石地址
  • php 自动化测试
  • 股东分红应该在哪个科目
  • 谷歌浏览器调试窗口怎么放下面
  • 好家伙41集
  • 业务招待费可以结转以后年度扣除吗
  • 应纳税所得额调整金额怎么算
  • 金蝶本月金额公式
  • 企业年报未报会有什么后果
  • 预付账款的会计编码是多少?
  • 已缴款未入库是缴费成功了吗
  • 出差补贴要不要发票呢?
  • 应补退税额是什么意思 法律
  • 用于福利费的增值税账务处理
  • 银行电子承兑到期了怎么兑现操作
  • 公司对于子公司的股权投资
  • 残保金中上年在职职工工资总额
  • 房产契税什么时候退税
  • 全面推开营改增政策指引
  • 设备租赁公司如何赚钱最快
  • 公司是否可以投资股票
  • 季节性停工计入成本吗
  • 多种不同的 MySQL 的 SSL 配置
  • unix操作系统有何特点?
  • u盘启动pe装机工具怎么用
  • centos好玩的命令
  • pps是什么文件
  • win10系统如何禁用触摸板
  • mac睡眠设置方法
  • centos7 ifcfg-lo
  • win7 ctrl+alt+del
  • 分形图形学
  • javascript运用
  • sublime text配置node.js调试(图文教程)
  • dos删除文件夹下所有文件 不删除父目录
  • Node.js中的事件循环是什么意思
  • python pdf操作
  • python3 pygame
  • js md5加密方法
  • js如何禁用按钮
  • 税务总局副局长饶
  • 如何查询企业税号
  • 外地户口在绍兴读小学
  • 双休日可以拿房产证吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设