
1.Screw是什么
Screw是一个开源的数据库文档生成工具,它看了可以帮助开发者自动的生成数据库相关的设计文档,能够从数据库中提取到表结构、字段信息、索引信息、主外键信息等。然后在生成的数据库文档中包含这些信息。它支持生成多种格式的文档, HTML、Markdown 或 Word 文档等。
1.1特点
-
简洁、轻量、设计良好
-
多数据库支持
-
多种格式文档
-
灵活扩展
-
支持自定义模板
1.2数据库支持
- MySQL
- MariaDB
- TIDB
- Oracle
- SqlServer
- PostgreSQL
- Cache DB(2016)
1.3 文档截图

2.Srew+PostgreSQL空指针问题
Srew (版本1.0.5)支持PostgreSQL 时会出现空指针错误,无法正常生成文档
2.1 问题现象
测试项目
1.项目结构

java
package com.example.document;
import cn.smallbun.screw.core.Configuration;
import cn.smallbun.screw.core.engine.EngineConfig;
import cn.smallbun.screw.core.engine.EngineFileType;
import cn.smallbun.screw.core.engine.EngineTemplateType;
import cn.smallbun.screw.core.execute.DocumentationExecute;
import cn.smallbun.screw.core.process.ProcessConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@SpringBootApplication
public class DbDocumentApplication implements ApplicationRunner {
@Autowired
ApplicationContext applicationContext;
public static void main(String[] args) {
SpringApplication.run(DbDocumentApplication.class, args);
}
@Override
public void run(ApplicationArguments args)throws Exception {
// 获取数据源
DataSource dataSourceMysql= applicationContext.getBean(DataSource.class);
// 配置文档生成引擎
EngineConfig engineConfig= EngineConfig.builder()
.fileOutputDir("D://DBDocument/") // 设置文档输出目录
.openOutputDir(false) // 设置生成完文档后是否打开输出目录,默认 false
.fileType(EngineFileType.WORD) // 设置生成文档的文件类型为 Word
.produceType(EngineTemplateType.freemarker) // 使用 freemarker 模板引擎
.build();
// 构建文档配置
Configuration config= Configuration.builder()
.title("数据库文档") // 设置文档标题
.version("1.0.0") // 设置文档版本
.description("数据库设计文档") // 设置文档描述
.dataSource(dataSourceMysql) // 设置数据源
.engineConfig(engineConfig) // 设置引擎配置
.produceConfig(getProcessConfig()) // 设置处理配置
.build();
// 执行文档生成
new DocumentationExecute(config).execute();
}
/**
* 获取处理配置
*
* @return ProcessConfig 处理配置对象
*/
private static ProcessConfig getProcessConfig() {
List<String> ignoreTableName = Arrays.asList("table1", "table2"); // 设置要忽略的表名列表
return ProcessConfig.builder()
.designatedTableName(new ArrayList<>()) // 指定需要处理的表名列表,默认为空
.designatedTablePrefix(new ArrayList<>()) // 指定需要处理的表前缀列表,默认为空
.designatedTableSuffix(new ArrayList<>()) // 指定需要处理的表后缀列表,默认为空
.ignoreTableName(ignoreTableName) // 设置忽略的表名
.build();
}
}
2.设置application.yaml文件
bash
server:
port: 5050
spring:
application:
name: DBDocument
datasource:
url: jdbc:postgresql://10.0.192.31:5432/star-marketing-test2
driver-class-name: org.postgresql.Driver
username: admin
password: 123456
执行后报错日志
bash
java.lang.IllegalStateException: Failed to execute ApplicationRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:765) [spring-boot-2.7.0.jar:2.7.0]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) [spring-boot-2.7.0.jar:2.7.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.7.0.jar:2.7.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) [spring-boot-2.7.0.jar:2.7.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) [spring-boot-2.7.0.jar:2.7.0]
at com.example.document.DbDocumentApplication.main(DbDocumentApplication.java:27) [classes/:na]
Caused by: cn.smallbun.screw.core.exception.ScrewException: java.lang.NullPointerException
at cn.smallbun.screw.core.util.ExceptionUtils.mpe(ExceptionUtils.java:62) ~[screw-core-1.0.5.jar:na]
at cn.smallbun.screw.core.execute.DocumentationExecute.execute(DocumentationExecute.java:57) ~[screw-core-1.0.5.jar:na]
at com.example.document.DbDocumentApplication.run(DbDocumentApplication.java:54) [classes/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:762) [spring-boot-2.7.0.jar:2.7.0]
... 5 common frames omitted
Caused by: java.lang.NullPointerException: null
at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011) ~[na:1.8.0_31]
at java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1006) ~[na:1.8.0_31]
at cn.smallbun.screw.core.process.DataModelProcess.process(DataModelProcess.java:104) ~[screw-core-1.0.5.jar:na]
at cn.smallbun.screw.core.execute.DocumentationExecute.execute(DocumentationExecute.java:50) ~[screw-core-1.0.5.jar:na]
... 7 common frames omitted
2.2 问题原因
从报错看,srew包中的DataModelProcess 104行出现了空指针。
为了解决这个问题需要先下载srew源码,参考
- GitHub地址
https://github.com/pingfangushi/screw
- GitHub代码
https://github.com/pingfangushi/screw.git
查看srew在 Github上的的代码库信息,发现构建的版本号并没有标签。因此可以通过source包中查看构建时间,按照构建时间查找提交记录。如下图

找到大概的提交节点后。确认DataModelProcess的反编译类和仓库代码是否一致,确认一致后我选区了图中的节点check分支

2.3 解决方法
思路:
1通过源码将问题解决,
2.接编译一个新包替换,但我的环境构建存在问题,因此只能用下下策, 将修改类的class替换srew的jar包中的同名类
参考变动:
修改:screw-core\src\main\java\cn\smallbun\screw\core\mapping\Mapping.java

修改:screw-core\src\main\java\cn\smallbun\screw\core\process\DataModelProcess.java


最后将修改后的类导出jar包,用jar包里的class替换1.0.5版本jar包中的类,即替换class


从新运行后,空指针问题解决, 并在指定的路径下正常创建了pgsql数据库的ER文档