首页 > 解决方案 > 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

但这不是很好看。

关于如何在泽西岛反序列化的想法?

标签: jerseyjax-rsdeserializationopenapijson-api

解决方案


推荐阅读