健壮性优化
This commit is contained in:
@@ -280,4 +280,18 @@
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>jdk17-home-env</id>
|
||||
<activation>
|
||||
<property>
|
||||
<name>env.JDK17_HOME</name>
|
||||
</property>
|
||||
</activation>
|
||||
<properties>
|
||||
<jdk17.home>${env.JDK17_HOME}</jdk17.home>
|
||||
</properties>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</project>
|
||||
|
||||
@@ -5,17 +5,15 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.io.*;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 多数据源配置管理器
|
||||
* <p>
|
||||
* 从 data/datasources.json 加载数据源列表,供 MyBatis 逆向工程插件选择使用。
|
||||
* 配置文件的路径和首次复制由 WorkUtilsProperties 统一管理。
|
||||
* Loads datasource definitions from data/datasources.json.
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@@ -30,31 +28,36 @@ public class DatasourceConfigManager {
|
||||
|
||||
@PostConstruct
|
||||
void init() {
|
||||
// data/ 目录下的文件已由 WorkUtilsProperties 统一确保存在
|
||||
reload();
|
||||
}
|
||||
|
||||
/** 重新加载数据源配置 */
|
||||
public synchronized void reload() {
|
||||
datasources.clear();
|
||||
Path configFile = getConfigFile();
|
||||
if (!Files.exists(configFile)) {
|
||||
log.warn("数据源配置文件不存在: {}", configFile.toAbsolutePath());
|
||||
log.warn("Datasource config file does not exist: {}", configFile.toAbsolutePath());
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
String json = new String(Files.readAllBytes(configFile), StandardCharsets.UTF_8);
|
||||
List<DatasourceConfig> loaded = JSON.parseArray(json, DatasourceConfig.class);
|
||||
if (loaded != null) {
|
||||
datasources.addAll(loaded);
|
||||
for (DatasourceConfig datasource : loaded) {
|
||||
if (datasource != null && datasource.getName() != null
|
||||
&& !datasource.getName().trim().isEmpty()) {
|
||||
datasources.add(datasource);
|
||||
}
|
||||
}
|
||||
}
|
||||
log.info("已加载 {} 套数据源配置", datasources.size());
|
||||
log.info("Loaded {} datasource configs", datasources.size());
|
||||
} catch (IOException e) {
|
||||
log.error("解析数据源配置失败: {}", e.getMessage());
|
||||
log.error("Failed to read datasource config: {}", e.getMessage());
|
||||
} catch (RuntimeException e) {
|
||||
log.error("Failed to parse datasource config: {}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/** 获取所有数据源名称列表 */
|
||||
public List<String> getDatasourceNames() {
|
||||
List<String> names = new ArrayList<>();
|
||||
for (DatasourceConfig ds : datasources) {
|
||||
@@ -63,14 +66,18 @@ public class DatasourceConfigManager {
|
||||
return names;
|
||||
}
|
||||
|
||||
/** 根据名称查找数据源配置 */
|
||||
public DatasourceConfig findByName(String name) {
|
||||
return datasources.stream()
|
||||
.filter(ds -> ds.getName().equals(name))
|
||||
.findFirst().orElse(null);
|
||||
if (name == null) {
|
||||
return null;
|
||||
}
|
||||
for (DatasourceConfig ds : datasources) {
|
||||
if (name.equals(ds.getName())) {
|
||||
return ds;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/** 获取配置文件的路径(供设置窗口打开编辑) */
|
||||
public Path getConfigFile() {
|
||||
return properties.getDatasourcesFilePath();
|
||||
}
|
||||
|
||||
@@ -9,10 +9,14 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@@ -41,7 +45,8 @@ public class OutputHelper {
|
||||
}
|
||||
fileOperationHelper.ensureDirectoryExists(filePath.getParent());
|
||||
|
||||
try (CSVWriter writer = new CSVWriter(new FileWriter(filePath.toFile()))) {
|
||||
try (Writer fileWriter = Files.newBufferedWriter(filePath, StandardCharsets.UTF_8);
|
||||
CSVWriter writer = new CSVWriter(fileWriter)) {
|
||||
if (headers.length > 0) {
|
||||
writer.writeNext(headers);
|
||||
}
|
||||
@@ -67,7 +72,10 @@ public class OutputHelper {
|
||||
boolean fileExists = fileOperationHelper.fileExists(filePath);
|
||||
boolean shouldWriteHeaders = !fileExists && headers.length > 0;
|
||||
|
||||
try (CSVWriter writer = new CSVWriter(new FileWriter(filePath.toFile(), true))) {
|
||||
try (Writer fileWriter = new OutputStreamWriter(
|
||||
Files.newOutputStream(filePath, StandardOpenOption.CREATE, StandardOpenOption.APPEND),
|
||||
StandardCharsets.UTF_8);
|
||||
CSVWriter writer = new CSVWriter(fileWriter)) {
|
||||
if (shouldWriteHeaders) {
|
||||
writer.writeNext(headers);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user