生成java文档表格工具
我们写的类属性注释有时候来自swagger,有时候来自于注释,有时候代码里不有,数据库表字段上才有。那么要写文档时怎么办?
于是写一个工具,从这三个地方生成统一的文档格式。一方面自己看着方便,别一方面如果要出详细设计文档也很方便。
主类:
package com.xx.mp; import com.alibaba.excel.util.StringUtils; import com.baomidou.mybatisplus.annotation.TableName; import com.xx.mp.indicator.entity.NetworkTaskDetail; import io.swagger.annotations.ApiModelProperty; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.sql.*; import java.util.*; public class DocUtil { public static void main(String args[]) throws Exception{ /** * 1.先看tableName标签 * 2.看swagger标签 * 3.反射原始属性名 * 4. javadoc -encoding UTF-8 -charset UTF-8 -private -d javadoc TaskConfigDTO.java * 再用Jsoup解析 */ boolean readJavaDoc=true; Class cls= NetworkTaskDetail.class; //改类名 Field md[]= cls.getDeclaredFields(); List datas=new ArrayList<>(); List<String> title= Arrays.asList("参数名","类型","说明"); if(readJavaDoc){ String path="/Users/chengzhong/code/xx/tj-monitor-platform/indicator/src/main/java/com/xx/mp/indicator/entity/javadoc/com/xx/mp/indicator/entity/NetworkTaskDetail.html"; Map<String,String> colMap=JavaDocUtil.parseMap(path); for (Field m : md) { if (Modifier.isFinal(m.getModifiers())) { continue; } String paramName = m.getName(); String txt = colMap.get(paramName); String remark = txt == null ? paramName : txt; Boolean require = true; String type = m.getType().getSimpleName(); //require ? "是" : "否", datas.add(Arrays.asList(paramName, type, remark)); } }else { if (cls.isAnnotationPresent(TableName.class)) { String tableName = ((TableName) cls.getAnnotation(TableName.class)).value(); Map<String, String> colMap = new MysqlMetaUtil().getTabProRemark(tableName); for (Field m : md) { if (Modifier.isFinal(m.getModifiers())) { continue; } String paramName = m.getName(); String txt = colMap.get(paramName); String remark = txt == null ? paramName : txt; Boolean require = true; String type = m.getType().getSimpleName(); //require ? "是" : "否", datas.add(Arrays.asList(paramName, type, remark)); } } else { boolean haveSwagger = false; for (Field m : md) { if (m.isAnnotationPresent(ApiModelProperty.class)) { haveSwagger = true; break; } } for (Field m : md) { if (Modifier.isFinal(m.getModifiers())) { continue; } String paramName = m.getName(); String remark = m.getName(); Boolean require = true; String type = m.getType().getSimpleName(); //如果有swagger if (m.isAnnotationPresent(ApiModelProperty.class)) { String aName = m.getAnnotation(ApiModelProperty.class).name(); if (!StringUtils.isBlank(aName)) { paramName = aName; } remark = m.getAnnotation(ApiModelProperty.class).value(); require = m.getAnnotation(ApiModelProperty.class).required(); type = m.getType().getSimpleName(); } //require ? "是" : "否", datas.add(Arrays.asList(paramName, type, remark)); } } } String html=createHtml(title,datas); System.out.println(html); } public static String createHtml(List<String> title,List<List<String>> datas){ StringBuffer sb=new StringBuffer(); sb.append("<html><head>"); sb.append("<style type='text/css'>"); sb.append("td,th{border:1px solid #000;padding:10px} table{border-collapse:collapse;}th{background-color:#dcdcdc}"); sb.append("</style></head><body>"); sb.append("<table style='border:1px solid #000' class=" xhe-border" class=" xhe-border"><tr>"); for(String t:title){ sb.append("<th>"+t+"</th>"); } sb.append("</tr>"); for(List<String> line:datas) { sb.append("<tr>"); for(String grid:line) { sb.append("<td>"+grid+"</td>"); } sb.append("</tr>"); } sb.append("</table></body></html>"); return sb.toString(); } } class MysqlMetaUtil{ final static String driver = "com.mysql.cj.jdbc.Driver"; String dbUrl="jdbc:mysql://192.168.xx.xx:3306/"; String dbName="xx"; String dbUserName="root"; String dbPasswd="xx"; Connection conn=null; public MysqlMetaUtil() throws Exception{ Class.forName(driver); String url = dbUrl + dbName + "?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai"; conn = DriverManager.getConnection(url,dbUserName,dbPasswd); } public Map<String,String> getTabProRemark(String tabName) throws Exception{ String sql="SELECT table_name,column_name columnName,data_type dataType,column_comment columnComment " + "FROM information_schema.COLUMNS WHERE table_name='"+tabName+"' AND table_schema = '"+dbName+"'"; DatabaseMetaData dbm=conn.getMetaData(); Statement stm = conn.createStatement(); ResultSet rs = stm.executeQuery(sql); Map<String,String> colVal=new HashMap<>(); while(rs.next()){ String name=rs.getString("columnName"); String label=rs.getString("columnComment"); colVal.put(convertCamelCase(name),label); } return colVal; } private static String convertCamelCase(String name) { String[] words=name.split("_"); if(words.length==1) { return words[0]; } StringBuffer sb=new StringBuffer(); for(int i=0;i<words.length;i++) { if(i==0) { sb.append(words[i]); }else { String first=String.valueOf(words[i].charAt(0)).toUpperCase(); if(words[i].length()>1) { first+=words[i].substring(1); } sb.append(first); } } return sb.toString(); } }
取生成的javadoc的html的注释的辅助类:
package com.xx.mp; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.File; import java.util.HashMap; import java.util.Map; public class JavaDocUtil { public static void main(String args[]) throws Exception{ } public static Map<String,String> parseMap(String path) throws Exception{ Document doc=Jsoup.parse(new File(path),"UTF-8"); Element ele=doc.select(".memberSummary").get(0); Elements fele=ele.select(".colLast"); Map<String,String> fieldMap=new HashMap<>(); for(int i=0;i<fele.size();i++){ String name=fele.get(i).select("code").text(); String descb=fele.get(i).select(".block").text(); //System.out.println(name+""+descb); fieldMap.put(name,descb); } return fieldMap; } }
辅助类需要jsoup的pom依赖:
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.9.2</version> </dependency>几种执行的方法在源文件的注释里有。
相关阅读
评论:
↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑