1. 背景
自前段时间,发表的一篇博文“Nacos-2.4.0最新版本docker镜像,兼容postgresql最新版本17和16”
有网友在评论区叫我出个修改源码的过程,今天就给大家简单分享一下关于“Nacos最新版(2.4.0)的postgresql插件适配修改方法”
2. Nacos最新版(2.4.0)的postgresql插件适配修改
2.1 首先下载源码
Nacos最新版(2.4.0)的postgresql插件源码地址(注意分支选择,根据更新时间判断,一定要选择最新分支):
https://github.com/nacos-group/nacos-plugin.git
下载下来后,目录结构如下:
2.2 用eclipse或idea打开
打开工程后,我们进入datasource插件目录,找到我们需要修改的postgresql数据库插件,只需要新增一个enum文件以及修改一个类即可完成Nacos最新版的postgresql插件正常适配。
2.3 新增枚举TrustedPostgreSqlFunctionEnum
将新增的枚举放入enums包下,该枚举主要是用于覆盖mysql的NOW(3)函数,因为该函数只有mysql才支持,postgresql等数据库不支持,因此需要去掉NOW(3)函数中的参数,如下所示:
package com.alibaba.nacos.plugin.datasource.enums;
import java.util.HashMap;
import java.util.Map;
/**
* The TrustedSqlFunctionEnum enum class is used to enumerate and manage a list of trusted built-in SQL functions.
* By using this enum, you can verify whether a given SQL function is part of the trusted functions list
* to avoid potential SQL injection risks.
*
* @author blake.qiu
*/
public enum TrustedPostgreSqlFunctionEnum {
/**
* NOW().
*/
NOW("NOW()", "NOW()");
private static final Map<String, TrustedPostgreSqlFunctionEnum> LOOKUP_MAP = new HashMap<>();
static {
for (TrustedPostgreSqlFunctionEnum entry : TrustedPostgreSqlFunctionEnum.values()) {
LOOKUP_MAP.put(entry.functionName, entry);
}
}
private final String functionName;
private final String function;
TrustedPostgreSqlFunctionEnum(String functionName, String function) {
this.functionName = functionName;
this.function = function;
}
/**
* Get the function name.
*
* @param functionName function name
* @return function
*/
public static String getFunctionByName(String functionName) {
TrustedPostgreSqlFunctionEnum entry = LOOKUP_MAP.get(functionName);
if (entry != null) {
return entry.function;
}
throw new IllegalArgumentException(String.format("Invalid function name: %s", functionName));
}
}
2.4 修改ConfigInfoMapperByPostgresql组件
在该类中新增一个构造函数即可,如下所示:
public class ConfigInfoMapperByPostgresql extends BaseConfigInfoMapper {
/**
* 解决NOW(integer)错误问题
* @author sinhy
* @since 2024-07-23 00:00
* @param functionName
* @return
* @see com.alibaba.nacos.plugin.datasource.impl.mysql.AbstractMapperByMysql#getFunction(java.lang.String)
*/
@Override
public String getFunction(String functionName)
{
return TrustedPostgreSqlFunctionEnum.getFunctionByName(functionName);
}
@Override
public String getDataSource() {
return DatabaseTypeConstant.POSTGRESQL;
}
}
从源码历史更新对比可以看到,的确只新增了一个构造函数,如下图红色框所示:
public String getFunction(String functionName)
{
return TrustedPostgreSqlFunctionEnum.getFunctionByName(functionName);
}
3. 编译打包
右键子工程“nacos-postgresql-datasource-plugin-ext”使用maven的打包命令clean install,会在target输出jar包
4. 部署
将编译好的postgresql插件,拷贝到nacos的plugins目录下,如下图:
好了,以上就是关于nacos最新版本2.4.0支持posgresql数据的适配修改。按照以上方法一步步操作,最终会让nacos最新版2.4.0成功支持postgresql!!