jersey - Jersey JAX-RS 和 OpenaAPI deepObject = 真正的反序列化问题
问题描述
我们?paging[offset]=3
在 Jersey 中使用方括号表示法 ( ) 反序列化查询参数时遇到问题。
我们正在使用 Jersey JAX-RS 并使用 swagger OpenAPI 注释我们的端点和 bean,并拥有自动生成我们的文档的工具。我们希望遵循JSON:API
描述新 API 的标准。JSON:API
指定要实现分页,API 必须接受以下格式的查询参数:?paging[offset]=0&paging[limit]=10
我们的 swagger 注释支持这个开箱即用,允许我们指定
@Parameter(
description = "paging",
style = ParameterStyle.DEEPOBJECT,
explode = Explode.TRUE)
这与方括号表示法paging[offset]
等兼容。paging
它会为我们的参数生成正确的文档。一切都很好,很棒,花花公子。
JAX-RS 是问题所在。JAX-RS 中有一个@QueryParam
注释。但是,要使用带有@QueryParam
注释的复杂对象,该类型必须具有a constructor with a single String parameter
. 没问题。让我们为我们的分页 bean 添加一个构造函数。
public class PagingBean {
public PagingBean(String stringValue){...}
@XmlElement
public getOffset(){...}
public setOffset(int offset){...}
@XmlElement
public getLimit(){...}
public setLimit(int limit){....}
}
所以我们的端点现在看起来像
@Get("/path")
public Response someEndpoint(
@Parameter(description = "paging",style = ParameterStyle.DEEPOBJECT,explode = Explode.TRUE) @QueryParam("paging") PagingBean paging
){
...
}
但是如果我们用
GET /rest/path?paging[limit]=10&paging[offset]=5
我们可以看到paging
请求参数为空。似乎泽西岛甚至没有意识到它paging[...
是paging
QueryParam
. 可能它期望正是paging
密钥,而不是类似paging\[?
的密钥。
我们可以通过注入 a@Context UriInfo ui
并检查请求参数来确认这一点。他们的关键是paging[offset]
和paging[limit]
一种解决方案是flatten
像这样对端点中的参数进行处理
@QueryParam("paging[limit]") pagingLimit,
@QueryParam("paging[offset]") pagingOffset
但这不是很好看。
关于如何在泽西岛反序列化的想法?
解决方案
推荐阅读
- c++ - 反转单链表的特定部分,即从 m 到 n
- javascript - 在nodejs中的同一连接内运行查询
- python - Pyspark:在列和索引上排名()?
- c# - 如何使列容易可见?
- python - 我在该图片中收到有关 .kv 文件的错误,有人可以帮助我并告诉我发生了什么吗?
- firebase - Flutter:从 Google 服务帐户生成访问令牌
- javascript - Vue.js 3 - 将组件插入插槽
- python - Keras Tokenizer.texts_to_sequences 返回列表列表而不是 np.array
- centos - 如何将 gitlab-runner 安装到 CentOS/fedora
- mysql - SQL QUERY 检查用户是否互相喜欢