- 数据工程
- 数据湖
- 大数据
- 对象存储
- 后端
【免费下载链接】lakeFS
lakeFS - Data version control for your data lake | Git for data
导读
UserList是 lakeFS Java SDK(clients/java)中用于承载「用户列表」查询结果的响应模型:当调用GET /auth/users(列出所有用户)或GET /auth/groups/{groupId}/members(列出组成员)接口时,服务端返回的 JSON 会被反序列化为该对象。它由分页元信息(pagination)和用户数组(results)两个必需字段组成,是 lakeFS 权限体系中所有用户枚举操作的标准返回载体。读完本文,你将掌握UserList的完整字段语义、底层 OpenAPI 契约、Java SDK 中的调用与序列化机制,以及如何利用分页字段遍历全部用户。
UserList 模型速览
UserList定义在 clients/java/docs/UserList.md,其 Java 实现位于 UserList.java。与文档一致,该模型只包含两个属性,且两个都是必需字段(@javax.annotation.Nonnull):
| Name | Type | Description | Notes |
|---|---|---|---|
| pagination | Pagination | 分页元信息(当前页是否有更多数据、下一页令牌、本页返回条数、每页上限) | 必需 |
| results | List<User> | 本页返回的用户对象数组 | 必需 |
在 api/swagger.yml 的 OpenAPI 契约中,该模型的定义如下:
UserList: type: object required: - pagination - results properties: pagination: $ref: "#/components/schemas/Pagination" results: type: array items: $ref: "#/components/schemas/User"从源码结构看,UserList是一个典型的「分页响应容器」:它本身不包含任何业务字段,只负责把「分页状态」与「实体列表」绑定在一起。这种设计在 lakeFS API 中普遍复用,例如GroupList(api/swagger.yml)与UserList结构完全一致,只是results元素类型不同。
属性详解:pagination —— 分页元信息
pagination的类型是Pagination,其完整字段见 Pagination.md,在 OpenAPI 中的定义见 api/swagger.yml:
| Name | Type | Description | Notes |
|---|---|---|---|
| hasMore | Boolean | Next page is available(是否还有下一页) | 必需 |
| nextOffset | String | Token used to retrieve the next page(下一页的游标令牌,传给下一次请求的after参数) | 必需 |
| results | Integer | Number of values found in the results(当前页返回的条目数量,最小值 0) | 必需 |
| maxPerPage | Integer | Maximal number of entries per page(单页最大条目数,最小值 0) | 必需 |
这四者的组合构成了 lakeFS 的游标式(cursor-based)分页协议:
hasMore决定调用方是否需要继续请求下一页;nextOffset是延续下一页的令牌,直接作为下一次请求的after查询参数;results统计当前页实际返回了多少条用户记录;maxPerPage告诉调用方服务端允许的单页上限(请求方通过amount参数控制每页大小,默认 100,见下文)。
属性详解:results —— 用户对象数组
results的元素类型是User,字段定义见 User.md,OpenAPI 契约见 api/swagger.yml:
| Name | Type | Description | Notes |
|---|---|---|---|
| id | String | 用户唯一标识,创建后不可修改 | 必需 |
| creationDate | Long | Unix Epoch 秒(用户创建时间) | 必需 |
| friendlyName | String | 比id更短的用户显示名;不保证唯一,主要用于 UI 展示 | 可选 |
| String | 用户邮箱;启用 API 认证时必填,且当前各认证器要求小写且唯一 | 可选 |
在 Java SDK 中,results被实现为List<User>,默认初始化为new ArrayList<>()(见 UserList.java),并提供了addResultsItem(User)便于流式构建列表。由于UserList的所有字段均标为必需,反序列化时若响应中缺少任一字段,校验逻辑会直接抛出IllegalArgumentException(见下文序列化机制)。
典型的 JSON 响应示例
综合上述契约,一次成功查询用户列表的响应体形如:
{ "pagination": { "has_more": true, "next_offset": "user_token_1024", "results": 100, "max_per_page": 100 }, "results": [ { "id": "jane.doe", "creation_date": 1710000000, "friendly_name": "Jane Doe", "email": "jane@example.com" }, { "id": "john", "creation_date": 1710100000, "friendly_name": "john", "email": "john@example.com" } ] }服务端如何生成 UserList:源码级调用链
UserList并非 Java SDK 专有概念,而是 lakeFS 服务端 Go 实现的统一响应格式(SDK 中对应apigen.UserList)。以「列出所有用户」为例,完整的调用链如下:
- HTTP 入口:
GET /auth/users由 pkg/api/controller.go 中的ListUsers处理器承接,请求参数为prefix、after、amount; - 权限校验:处理器先通过
c.authorize(...)校验调用方是否具备ListUsersAction权限(资源为All),未授权则直接返回; - 调用认证服务:将请求参数转换为
model.PaginationParams{After, Prefix, Amount}后调用c.Auth.ListUsers,其接口定义在 pkg/auth/service.go,并由 basic_service.go 提供默认实现; - 组装响应:处理器用返回的
users切片与paginator组装出apigen.UserList——HasMore取paginator.NextPageToken != ""、NextOffset取paginator.NextPageToken、Results取paginator.Amount,最后把每个用户实体映射为apigen.User{Id, Email, FriendlyName, CreationDate}。
也就是说,UserList中的pagination字段本质上是对 Go 侧Paginator(含下一页令牌与条数)的 JSON 化投影。这也是为什么next_offset是字符串令牌而不是页号——服务端使用游标式分页,令牌本身就是 KV 存储中的定位键。
Java SDK 中的实际调用
UserList在 Java SDK 中主要通过AuthApi的listUsers与listGroupMembers两个操作被返回,对应 AuthApi.java。listUsers的 OpenAPI 定义见 api/swagger.yml,listGroupMembers见 api/swagger.yml,二者成功时(HTTP 200)返回的 schema 都是UserList。
listUsers支持三个可选查询参数(由 AuthApi.java 中的APIlistUsersRequest暴露):
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
prefix | String | 只返回以该值开头的用户 | 可选 |
after | String | 返回该令牌之后的数据(配合pagination.nextOffset使用) | 可选 |
amount | Integer | 每页返回多少条 | 100 |
基于生成的 SDK 结构,典型用法如下(builder 风格的请求链最终返回UserList):
import io.lakefs.clients.sdk.AuthApi; import io.lakefs.clients.sdk.ApiClient; import io.lakefs.clients.sdk.ApiException; import io.lakefs.clients.sdk.model.UserList; import io.lakefs.clients.sdk.model.User; ApiClient client = new ApiClient(); client.setBasePath("https://lakefs.example.com/api/v1"); // 配置 AccessKey / SecretKey 后: AuthApi auth = new AuthApi(client); // 1. 只取前 100 个用户(默认每页 100) UserList firstPage = auth.listUsers() .amount(100) .execute(); // 2. 遍历全部用户:利用 pagination.hasMore 与 nextOffset 翻页 String nextOffset = null; do { // 构建带 after 参数的请求(实际翻页需重新发起请求) UserList page = auth.listUsers() .after(nextOffset) .amount(100) .execute(); for (User u : page.getResults()) { System.out.println(u.getId() + " -> " + u.getCreationDate()); } nextOffset = page.getPagination().getHasMore() ? page.getPagination().getNextOffset() : null; } while (nextOffset != null);同理,枚举某个组的成员只需换成auth.listGroupMembers(groupId),返回的同样是UserList,因此同一套pagination/results读取与翻页逻辑可以完全复用。
序列化与校验机制
UserList由 OpenAPI Generator 自动生成,其 JSON 处理基于 Gson,包含三层值得注意的机制(均在 UserList.java 中):
- 必需字段校验:
openapiRequiredFields静态集合包含pagination与results;validateJsonElement在反序列化时逐一检查这两个字段是否存在,缺失即抛异常(UserList.java)。同时它会递归调用Pagination.validateJsonElement与User.validateJsonElement校验嵌套对象,并确认results确实为 JSON 数组; - 自定义 TypeAdapter:
CustomTypeAdapterFactory注册在 JSON.java,负责把未知字段(未在openapiFields中声明的键)存入additionalProperties,从而对服务端未来的向后兼容扩展保持宽容——这也是为什么模型还带有putAdditionalProperty/getAdditionalProperties系列方法; - 双向转换便捷方法:
UserList.fromJson(String)与toJson()分别封装了反序列化与序列化入口,便于调试或手动构造响应体。
对应地,UserListTest.java 为pagination与results两个属性各生成了独立的模型测试方法,可作为熟悉该模型 API 的快速索引。
实用要点与注意事项
结合上面的契约与实现,使用UserList时有几点值得注意:
- 两个字段都是必需的:手动构造或解析
UserList时,pagination与results缺一不可,否则 SDK 的校验逻辑会抛异常; - 翻页依赖令牌而非页码:不要自增页码,应始终把上一页
pagination.nextOffset作为下一页的after参数;当hasMore=false时即可结束遍历; results的数量上限由amount控制:默认 100,若需减少单页负载可显式传入更小的amount;- 用户
id不可编辑:它是用户实体在 lakeFS 中的稳定标识,friendlyName仅用于展示且不保证唯一; - 权限前置:调用前请确保调用主体具备
ListUsersAction权限(服务端在 pkg/api/controller.go 强制执行校验),否则将收到 401 响应。
深入阅读
- 模型文档:clients/java/docs/UserList.md、clients/java/docs/Pagination.md、clients/java/docs/User.md
- OpenAPI 契约:api/swagger.yml(
UserListschema 见 L1115-L1126,/auth/users端点见 L2209-L2233) - SDK 实现:UserList.java、AuthApi.java
- 服务端实现:pkg/api/controller.go、pkg/auth/service.go、pkg/auth/basic_service.go
- 数据工程
- 数据湖
- 大数据
- 对象存储
- 后端
【免费下载链接】lakeFS
lakeFS - Data version control for your data lake | Git for data
相关推荐
lakeFS Java SDK 中的 ObjectStatsList 模型:对象列表分页响应全解析
lakeFS Java SDK 中的 ObjectStatsList 模型:对象列表分页响应全解析 导读 在 lakeFS 的 Java SDK( io.lak
数据工程数据湖大数据对象存储后端lakeFS Java SDK 的 CredentialsList 模型:用户访问密钥列表的分页结构与序列化实战
lakeFS Java SDK 的 CredentialsList 模型:用户访问密钥列表的分页结构与序列化实战 导读 CredentialsList 是 la
数据工程数据湖大数据对象存储后端lakeFS Rust SDK 数据模型解析:GroupList 与认证组列表分页响应
lakeFS Rust SDK 数据模型解析:GroupList 与认证组列表分页响应 导读 GroupList 是 lakeFS HTTP API 中"分组(
数据工程数据湖大数据对象存储后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考