栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot启动时执行脚本——打包后脚本中文乱码

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot启动时执行脚本——打包后脚本中文乱码

springboot启动时执行脚本——打包后脚本中文乱码

springboot启动时执行脚本配置使用参见:https://blog.csdn.net/hyf576501135/article/details/121768985

​ 在用Eclipse或者IDE工具启动的时候,脚本正常执行并且没有出现中文乱码;但是在打包发布后,发现正常执行,但是出现了中文乱码,然后百度了一下,基本上全部都是让在配置文件里面增加配置spring.datasource.sql-script-encoding=utf-8,然后清一色的写的是使用springboot自带的方式进行启动的。但是使用代码的方式灵活启动没有写怎么搞…找资料没法了,就只能跟代码

看代码,其实最终是给DataSourceInitializer设置了DatabasePopulator这个类,先看DataSourceInitializer类的关键代码

public class DataSourceInitializer implements InitializingBean, DisposableBean {

......

	
	@Override
	public void afterPropertiesSet() {
		execute(this.databasePopulator);
	}

	
	@Override
	public void destroy() {
		execute(this.databaseCleaner);
	}

	private void execute(@Nullable DatabasePopulator populator) {
		Assert.state(this.dataSource != null, "DataSource must be set");
		if (this.enabled && populator != null) {
			DatabasePopulatorUtils.execute(populator, this.dataSource);
		}
	}

}

第一步:执行execute,由工具类继续执行

public abstract class DatabasePopulatorUtils {

	
	public static void execute(DatabasePopulator populator, DataSource dataSource) throws DataAccessException {
		Assert.notNull(populator, "DatabasePopulator must not be null");
		Assert.notNull(dataSource, "DataSource must not be null");
		try {
			Connection connection = DataSourceUtils.getConnection(dataSource);
			try {
				populator.populate(connection);
			}
			finally {
				DataSourceUtils.releaseConnection(connection, dataSource);
			}
		}
		catch (scriptException ex) {
			throw ex;
		}
		catch (Throwable ex) {
			throw new UncategorizedscriptException("Failed to execute database script", ex);
		}
	}

}

第二步:由ResourceDatabasePopulator自身执行populate方法

	@Override
	public void populate(Connection connection) throws scriptException {
		Assert.notNull(connection, "'connection' must not be null");
		for (Resource script : this.scripts) {
			EncodedResource encodedscript = new EncodedResource(script, this.sqlscriptEncoding);
			scriptUtils.executeSqlscript(connection, encodedscript, this.continueOnError, this.ignoreFailedDrops,
					this.commentPrefixes, this.separator, this.blockCommentStartDelimiter, this.blockCommentEndDelimiter);
		}
	}

看到把传入的resource进行包装,并且指定了sqlscriptEncoding的编码格式,因此只需要设置ResourceDatabasePopulator这个实例的这个编码参数即可。修改后获取DatabasePopulator方法:

private DatabasePopulator databasePopulator(boolean hasShema) throws IOException {
        ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
    //设置文件编码参数
        populator.setSqlscriptEncoding("utf-8");
        ResourcePatternResolver resolver = ResourcePatternUtils.getResourcePatternResolver(null);;
        Resource[] resources = null;
        if (!hasShema) {
            resources = resolver.getResources("classpath:/" + sqlscriptSchema + "/*");
            for (Resource resource : resources) {
                populator.addscript(resource);
            }
        }
        resources = resolver.getResources("classpath:/" + sqlscriptData + "/*");
        for (Resource resource : resources) {
            populator.addscript(resource);
        }
        resources = resolver.getResources("classpath:/" + sqlscriptProcedure + "/*");
        for (Resource resource : resources) {
            populator.addscript(resource);
        }
        return populator;
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/672952.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号