背景:项目中需要扫描注解然后,把有对应注解的方法,生成OpenApi3格式的json返回给前台。由于中间涉及到转发,所以存在OpenApi3对象与json之间的转化。【其实直接把OpenApi3对象序列化了不就行了么。我也是不知道为什么需求就变的奇奇怪怪的,总之把遇到的难点记录下来就是了】
第一部分
JSONObject转OpenApi3
由于下游接口没做好看,我自己从文件读了一组数据出来
这个过程先是JSONObject直接toString转JsonNode
然后就用OpenApi3Parser的转化方法把Node转化成了OpenApi3对象。
需要注意的是OpenApi3Parser的转化方法除了JsonNode一定要一个路径作为输入,这个路径对应的File会作为一个临时文件使用,不影响批量转化。要说为何,那只能说他源码就这样啊。。。
这题提供一下jar包名称:
openapi-parser-4.0.4.jar
public ListgetOpenApi3FromMS() throws Exception{ String s = FileUtils.readFileToString(new File("/Users/i562941/documents/1.txt")); // System.out.println(s); JSonArray ja = JSONArray.parseArray(s); List o3s = new ArrayList (); 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 getOpenApi3Fromdocument(List files) {
List o3s = new ArrayList();
for (File file : files) {
OpenApi3Parser openApi3Parser = new OpenApi3Parser();
List 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…



