@JsonAnyGetter and Swagger document

问题:

* 在model里面将原本字段的get方法更名为any方法,并且使用了@JsonAnyGetter --> 将字段动态序列化为类成员变量(output the map entries as members of this POJO class)

* 导致swagger文档中缺少了该字段

解决方案:

* 采用自定义的ModelConverter实现Schema自定义,将需要显示的动态字段信息放进去

实现:

1. 定义一个CustomConverter.class implements ModelConverter

2. 重写resole方法

3. 找到定义的字段名(dynamicField),处理parent Schema -> return

4.  在启动swagger时注册好自定义的conventer,读取需要转换的model

// initialize swagger custom modelConvertersModelConverters.getInstance().addConverter(new CustomConverter());

错误思路

在RestEasy项目中,集成Swagger使用的方式是

    1. 在Application的getClassed()方法里加载OpenApiResource.class

    2. 自定义CustomOpenApiReader 集成Reader

    3. 在openapi-configuration.json中的readerClass里配置加载CustomOpenApiReader

在查看Reader的源码时发现在parseMethod返回了operation,其中operation包含有response,response的Schema就在其中,所以想到可以在自定义的CustomReader类中重写parseMethod方法,在调用特定方法的时候,再去定位到目标字段,再注册CustomConverter,使用ModelConverters读取model,获得model对应的Schema,设置到operation中返回,无效。


想把注册CustomConverter写到reader定位的具体方法里,刚启动时自定义model不生效,点击刷新页面,生效,原因是

-- 启动项目时首先加载了ModelConverter,再加载CustomReader,所以在CustomReader里注册CustomConverter并没有马上改变model

-- 点击刷新时,CustomConverter在上一次已经被注册了,所以model可以改变

-- 所以要使注册立即生效,CustomConverter不能在Reader里注册

-- 最后采取了在启动项目时就注册

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容