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

  • 荣耀v30pro是双卡怎么安装(荣耀v30pro是双卡双待手机吗)

    荣耀v30pro是双卡怎么安装(荣耀v30pro是双卡双待手机吗)

  • 苹果手机如何微信设置密码锁(苹果手机如何微信多开)

    苹果手机如何微信设置密码锁(苹果手机如何微信多开)

  • WPS怎样把单元格一分为二(wps怎样把单元格一分为二)

    WPS怎样把单元格一分为二(wps怎样把单元格一分为二)

  • 淘宝520活动什么时候开始(淘宝520活动什么时候开始2023)

    淘宝520活动什么时候开始(淘宝520活动什么时候开始2023)

  • 小米手机还原出厂设置在哪里?(小米手机还原出厂设置怎么操作)

    小米手机还原出厂设置在哪里?(小米手机还原出厂设置怎么操作)

  • 拼多多为什么要做拼主(拼多多为什么要交保证金)

    拼多多为什么要做拼主(拼多多为什么要交保证金)

  • kirin659是什么处理器(kirin650是什么处理器)

    kirin659是什么处理器(kirin650是什么处理器)

  • 手机号没交费变空号怎么办(手机号没交费变空号会影响以后贷款吗)

    手机号没交费变空号怎么办(手机号没交费变空号会影响以后贷款吗)

  • 手机仅限紧急呼叫怎样才能恢复(手机仅限紧急呼叫什么意思)

    手机仅限紧急呼叫怎样才能恢复(手机仅限紧急呼叫什么意思)

  • 淘宝卖家可以投诉买家吗(淘宝卖家可以投诉快递员嘛)

    淘宝卖家可以投诉买家吗(淘宝卖家可以投诉快递员嘛)

  • 什么是5G消息(5g消息是什么业务收费吗)

    什么是5G消息(5g消息是什么业务收费吗)

  • u盘删除的文件会在电脑回收站吗(u盘删除的文件可以恢复吗)

    u盘删除的文件会在电脑回收站吗(u盘删除的文件可以恢复吗)

  • 华为手机通知管理能关闭吗(华为手机通知管理怎么关闭声音)

    华为手机通知管理能关闭吗(华为手机通知管理怎么关闭声音)

  • 快手极速版怎么发说说(快手极速版怎么样才能快速赚钱)

    快手极速版怎么发说说(快手极速版怎么样才能快速赚钱)

  • 荣耀20白名单怎么设置(荣耀白名单怎么设置方法在手机上)

    荣耀20白名单怎么设置(荣耀白名单怎么设置方法在手机上)

  • 怎么调路灯自动定时器(路灯怎么调定时)

    怎么调路灯自动定时器(路灯怎么调定时)

  • 荣耀20pro怎么插耳机(荣耀20pro怎么插卡)

    荣耀20pro怎么插耳机(荣耀20pro怎么插卡)

  • apple distribution什么意思

    apple distribution什么意思

  • 快手必须要本人直播吗(快手必须本人的身份证提现吗)

    快手必须要本人直播吗(快手必须本人的身份证提现吗)

  • 苹果微信能分身吗(苹果微信能分身份吗)

    苹果微信能分身吗(苹果微信能分身份吗)

  • 华为路由器a1怎么设置(华为路由器a1怎么样)

    华为路由器a1怎么设置(华为路由器a1怎么样)

  •  苹果怎么看谁连了热点(苹果怎么看谁挂的电话)

    苹果怎么看谁连了热点(苹果怎么看谁挂的电话)

  • Vue3通透教程【十四】TS复杂类型详解(一)

    Vue3通透教程【十四】TS复杂类型详解(一)

  • 谈谈ES5和ES6的区别(es5和es6的区别)

    谈谈ES5和ES6的区别(es5和es6的区别)

  • 印花税购买使用要求及印花税会计分录?
  • 纳税申报期限是纳税期限期满后的时间
  • 养殖合作社属于什么行业
  • 差额冲销
  • 个体户可以开多个银行账户吗
  • 通行费 发票
  • 小企业会计准则以前年度损益调整
  • 开发票税前税后
  • 厂房鉴定公司
  • 利息保障倍数为负数,是偿债能力弱的表现
  • 企业清算时卖了车怎么办
  • 会计凭证的概念及分类
  • 详解劳务报酬个人所得税应该怎么计算?
  • 已抵扣的增值税怎么做账
  • 环境保护税法什么时候出台
  • 预付卡发票报销单怎么写
  • 本年利润怎么算利润总额
  • 发票超过标准可以报销吗
  • 向境外支付违约金要代扣税吗
  • 我的初级备考经历怎么写
  • 企业交纳房产税,土地使用税、车船使用税应借记( )账户
  • 月末计提电费
  • 安全生产费用怎么支出
  • 家装行业如何确认收入
  • ubuntu 20.04.1
  • PHP:Memcached::prependByKey()的用法_Memcached类
  • 金融负债的范围
  • 蝴蝶兰的养殖方法和注意事项视频
  • php网站结构
  • PHP:pcntl_strerror()的用法_PCNTL函数
  • 纳税申报方式的税务申报工作常规流程图
  • 安博塞利国家公园简介
  • 阿尔卑斯山城市
  • 深度学习实战10-数学公式识别-将图片转换为Latex(img2Latex)
  • vue 实战
  • es6 promise await
  • php实现会话的步骤
  • 政府补助收入是免税收入还是不征税收入
  • 产品补发原来的要退吗
  • 租金没有发票可以退税吗
  • 企业所得税汇算清缴扣除标准2023
  • 企业年度报告包括哪些内容
  • 借预收账款贷其他应付款什么意思
  • 应付工资怎么记账
  • 库存商品和固定资产是单位会计资产核算的两项内容
  • 控股子公司注销公告是利空吗
  • 厂区绿化工程计入什么科目
  • sql自定义
  • 销售额多少需要纳税
  • 未分配利润可以弥补亏损吗
  • 债券到期的账面价值计算
  • 开发成本期末有余额吗
  • 现金折扣不考虑增值税
  • 维修费成本怎么结转
  • 收到返还工会经费大于管理费用
  • 费用科目可以在借方吗
  • 确认主营业务收入分录怎么写
  • 前程无忧是怎么收费的
  • 工程施工企业的会计科目如何设置
  • 旅游业开具的是什么证明
  • 销项负数发票如何勾选
  • 旅游饮食服务企业会计核算的特点包括
  • 帐薄和账簿区别
  • centos7如何安装yum命令
  • mysql优化十大技巧
  • 登录ubuntu桌面
  • 包含正在使用的windows版本 无法格式化
  • u盘制作iso镜像文件启动
  • 超小平板电脑
  • linux中nfs的配置
  • linux创建.c
  • win7软件包
  • glClearBufferSubData
  • javascript的数组可以存放任何类型
  • 查询某个时间段
  • 如何利用Fabric自动化你的任务
  • 国家税务总局关于个人所得税有关政策问题的通知
  • 江苏国税电子税务局网上申报流程
  • 居间服务费税收优惠政策
  • 什么叫以物易物
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设