背景:项目中需要扫描注解然后,把有对应注解的方法,生成OpenApi3格式的json返回给前台。由于中间涉及到转发,所以存在OpenApi3对象与json之间的转化。【其实直接把OpenApi3对象序列化了不就行了么。我也是不知道为什么需求就变的奇奇怪怪的,总之把遇到的难点记录下来就是了】
第一部分
JSONObject转OpenApi3
由于下游接口没做好看,我自己从文件读了一组数据出来
这个过程先是JSONObject直接toString转JsonNode
然后就用OpenApi3Parser的转化方法把Node转化成了OpenApi3对象。
需要注意的是OpenApi3Parser的转化方法除了JsonNode一定要一个路径作为输入,这个路径对应的File会作为一个临时文件使用,不影响批量转化。要说为何,那只能说他源码就这样啊。。。
这题提供一下jar包名称:
openapi-parser-4.0.4.jar
public List<OpenApi3> getOpenApi3FromMS() throws Exception{
String s = FileUtils.readFileToString(new File("/Users/i562941/Documents/1.txt"));
// System.out.println(s);
JSONArray ja = JSONArray.parseArray(s);
List<OpenApi3> o3s = new ArrayList<OpenApi3>();
for (Object o : ja) {
//tmpfile
OpenApi3Parser openApi3Parser = new OpenApi3Parser();
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(o.toString());
// System.out.println(jsonNode.toString());
//String classPath = Thread.currentThread().getContextClassLoader().getResource("/").getPath();
String classPath = "";
classPath = classPath == null ? "" : classPath;
// System.out.println("cp:" + classPath);
//OpenApi3 execute parse need a tmpfile,Tested,this file reusable
OpenApi3 openApi3 = openApi3Parser.parse(jsonNode, new URI("file", null, classPath + "/tmp.txt", null).toURL());
o3s.add(openApi3);
System.out.println(openApi3.toString());
}
//every Object as a File
return o3s;
}
第二部分 json文件转OpenApi3
List<OpenApi3> getOpenApi3FromDocument(List<File> files) {
List o3s = new ArrayList<OpenApi3>();
for (File file : files) {
OpenApi3Parser openApi3Parser = new OpenApi3Parser();
List<ServiceMethod> events = new ArrayList<>();
OpenApi3 openApi3 = null;
try {
openApi3 = openApi3Parser.parse(file);
} catch (Exception e) {
log.error("[EventTypeServiceResolverImpl#parseEventsFromDocument] Failed to parse event metadata by file [{}].", file.getName(), e);
throw new ApplicationRuntimeException(ErrorCode.ERR_EVENT_TYPE_PARSE);
}
o3s.add(openApi3);
}
return o3s;
}
第三部分 类定义 Method转OpenApi3对象
初步说一下。用到的是Swagger源码中的技术。
swagger-core:1.5.22
ModelConverters这个类可以好好看一下。
具体的代码现在还没有。过几天看看。
TO BE CONTINUE…