问题:
* 在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里注册
-- 最后采取了在启动项目时就注册