SprintBoot +Screw+PostgreSQL生成数据库文档时空指针问题

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文档

相关推荐
L-岁月染过的梦2 小时前
前端使用JS实现端口探活
开发语言·前端·javascript
Space-Junk2 小时前
C#描述-计算机视觉OpenCV(8):OCR字符检测
opencv·计算机视觉·c#
idealzouhu2 小时前
【Android】深入浅出 JNI
android·开发语言·python·jni
廋到被风吹走2 小时前
【Java】【Jdk】Jdk11->Jdk17
java·开发语言·jvm
nike0good2 小时前
Goodbye 2025 题解
开发语言·c++·算法
Sheep Shaun2 小时前
STL中的unordered_map和unordered_set:哈希表的快速通道
开发语言·数据结构·c++·散列表
jllllyuz2 小时前
基于帧差法与ViBe算法的MATLAB前景提取
开发语言·算法·matlab
DsirNg2 小时前
CategoryTree 性能优化完整演进史
开发语言·前端
kevin_水滴石穿2 小时前
C#获取程序集和文件版本
开发语言·c#