Jmix 中 REST API 的两种实现( 二 )


Spring 控制器 API然后我们再看看 Spring 的 RestController 方式 。首先,我们定义一个控制器:
@RestController("sls_ProductController")@RequestMapping("/products")public class ProductController {@Autowiredprivate 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 中使用两种类型的 REST API 其实都不复杂,但是 , 也是各有优势:
Jmix 服务 API:
  • 不用编写控制器代码 , 仅通过 XML 配置即可使用
  • 默认使用 Jmix 的安全机制
  • 可以使用 Fetch plan 定义返回实体的字段
Spring 控制器:
  • 更加灵活,可以使用 Spring 控制器自定义 HTTP 状态码、响应类型或者异常错误
  • 除了使用服务层的实体控制外 , 还可以在控制器层使用自定义的 DTO 对返回实体的信息做进一步控制
因此,在大多数情况下 , 我们仅使用 Jmix 的服务 API 就能够满足使用要求 。针对部分复杂场景可以使用 Spring 控制器 API 。
文中使用的 Jmix 版本:1.3.1
【Jmix 中 REST API 的两种实现】

推荐阅读