如何编辑或更改 Spring 参数扩展?
How to edit or alter Spring parameter expansion?
在application.yml中:
flyway:
locations: classpath:/db/migration, classpath:/db/local
placeholders:
csvpath: ${user.dir}/src/main/resources/db/local
在 flyway 初始化脚本中:
LOAD DATA LOCAL INFILE '${csvpath}/data.csv'
INTO TABLE myscheama.t1 FIELDS TERMINATED BY ','
ENCLOSED BY '"' LINES TERMINATED BY '\n'
IGNORE 1 LINES;
${user.dir} 扩展到当前项目的路径(我想要的),但是在 Windows 框上扩展为路径分隔符“\”。当 Spring Boot 启动时,flyway 会立即执行,将扩展路径传递到我的数据库 (MySQL),它将不接受路径名中的“\”。我如何才能强制使用“/”或在我的路径中使用正确的斜杠来使其正常工作?
我能够通过实施 EnvironmentPostProcessor 来解决这个问题:
将 META-INF/spring.factories
属性文件添加到 src/main/resources
# Environment Post Processor
org.springframework.boot.env.EnvironmentPostProcessor = com.gitlab.ttubbs.myapp.PropertiesEnvironmentPostProcessor
添加实现:
package com.gitlab.ttubbs.myapp;
import java.util.Map;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
public class PropertiesEnvironmentPostProcessor implements EnvironmentPostProcessor
{
private static final String SYSTEM_PROPERTIES = "systemProperties";
private static final String USER_DIR = "user.dir";
private static final char BACKSLASH = '\';
private static final char FORWARD_SLASH = '/';
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
MutablePropertySources propertySources = environment.getPropertySources();
Map<String, Object> systemProperties = getMapPropertySource(propertySources, SYSTEM_PROPERTIES);
// Update ${user.dir} to use FORWARD_SLASH instead of BACKSLASH
updateMapProperty(systemProperties, USER_DIR, environment.getProperty(USER_DIR).replace(BACKSLASH, FORWARD_SLASH));
}
private Map<String, Object> getMapPropertySource(MutablePropertySources propertySources, String sourceName) {
if (propertySources.contains(sourceName)) {
PropertySource<?> source = propertySources.get(sourceName);
if (source instanceof MapPropertySource) {
MapPropertySource target = (MapPropertySource) source;
return target.getSource();
}
}
return null;
}
private void updateMapProperty(Map<String, Object> target, String key, String value) {
if(target != null) {
target.put(key, value);
}
}
}
在application.yml中:
flyway:
locations: classpath:/db/migration, classpath:/db/local
placeholders:
csvpath: ${user.dir}/src/main/resources/db/local
在 flyway 初始化脚本中:
LOAD DATA LOCAL INFILE '${csvpath}/data.csv'
INTO TABLE myscheama.t1 FIELDS TERMINATED BY ','
ENCLOSED BY '"' LINES TERMINATED BY '\n'
IGNORE 1 LINES;
${user.dir} 扩展到当前项目的路径(我想要的),但是在 Windows 框上扩展为路径分隔符“\”。当 Spring Boot 启动时,flyway 会立即执行,将扩展路径传递到我的数据库 (MySQL),它将不接受路径名中的“\”。我如何才能强制使用“/”或在我的路径中使用正确的斜杠来使其正常工作?
我能够通过实施 EnvironmentPostProcessor 来解决这个问题:
将
META-INF/spring.factories
属性文件添加到src/main/resources
# Environment Post Processor org.springframework.boot.env.EnvironmentPostProcessor = com.gitlab.ttubbs.myapp.PropertiesEnvironmentPostProcessor
添加实现:
package com.gitlab.ttubbs.myapp; import java.util.Map; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.PropertySource; public class PropertiesEnvironmentPostProcessor implements EnvironmentPostProcessor { private static final String SYSTEM_PROPERTIES = "systemProperties"; private static final String USER_DIR = "user.dir"; private static final char BACKSLASH = '\'; private static final char FORWARD_SLASH = '/'; @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { MutablePropertySources propertySources = environment.getPropertySources(); Map<String, Object> systemProperties = getMapPropertySource(propertySources, SYSTEM_PROPERTIES); // Update ${user.dir} to use FORWARD_SLASH instead of BACKSLASH updateMapProperty(systemProperties, USER_DIR, environment.getProperty(USER_DIR).replace(BACKSLASH, FORWARD_SLASH)); } private Map<String, Object> getMapPropertySource(MutablePropertySources propertySources, String sourceName) { if (propertySources.contains(sourceName)) { PropertySource<?> source = propertySources.get(sourceName); if (source instanceof MapPropertySource) { MapPropertySource target = (MapPropertySource) source; return target.getSource(); } } return null; } private void updateMapProperty(Map<String, Object> target, String key, String value) { if(target != null) { target.put(key, value); } } }