JAXRS项目中Swagger UI与@MatrixParam的兼容性问题及解决方案咨询
我最近在做一个基于JAXRS注解的项目,同时配置了Swagger UI(遵循OAS3规范)来汇总所有接口,还想直接在UI里调用接口。查了OAS3的规范,它是支持矩阵参数的,但实际用下来发现,JAXRS和Swagger UI对矩阵参数的处理方式完全不兼容,导致带@MatrixParam的接口根本没法在Swagger UI里正常调用,快愁死了,想请教大家有没有解决办法!
先给大家理清楚矛盾点:
JAXRS对@MatrixParam的处理逻辑
在JAXRS里,我们是通过方法参数上的@MatrixParam注解来定义矩阵参数的,比如下面这个接口:
@GET @Path("example/get") @Produces(MediaType.APPLICATION_JSON) String getNotifierType(@MatrixParam("notifierType") String notifierType) throws CustomException;
JAXRS会自动识别example/get这个路径后面的;notifierType=x格式的参数,把它绑定到方法的notifierType参数上,这部分是正常的。
Swagger UI对矩阵参数的期望
但Swagger UI要识别矩阵参数,要求路径里必须带对应的占位符,比如得把@Path改成"example/get{notifierType}",接口定义就变成这样:
@GET @Path("example/get{notifierType}") @Produces(MediaType.APPLICATION_JSON) String getNotifierType(@MatrixParam("notifierType") String notifierType) throws CustomException;
这时候问题就彻底爆发了:
Swagger UI生成的CURL请求是这样的:
curl -X 'GET' 'https://localhost:8080/xyz/config/example/self;notifierType=email_local' -H 'accept: application/json'
但JAXRS现在会把example/get{notifierType}当成完整的路径前缀,所以它实际期望的请求路径是https://localhost:8080/xyz/config/example/self{notifierType};notifierType=email_local,这就完全对不上了——Swagger UI生成的请求找不到对应的接口,而按照JAXRS要求的路径来发请求,又不是我们实际要的逻辑。
如果我不改@Path,保持JAXRS的写法,Swagger UI又根本不会把@MatrixParam识别成可输入的参数,自然也没法在UI里填写调用。
有没有朋友遇到过类似的问题?有没有办法让JAXRS里带@MatrixParam的接口,既能被JAXRS正确解析,又能在Swagger UI里正常展示、填写参数并调用?万分感谢!
补充:附一张Swagger UI生成请求的截图(对应未修改
@Path的JAXRS接口),能看到Swagger UI完全没识别出这个矩阵参数,更没法让用户输入调用。
内容来源于stack exchange

