如何编辑或更改 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 来解决这个问题:

  1. META-INF/spring.factories 属性文件添加到 src/main/resources

    # Environment Post Processor 
    org.springframework.boot.env.EnvironmentPostProcessor = com.gitlab.ttubbs.myapp.PropertiesEnvironmentPostProcessor
    
  2. 添加实现:

    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);
            }
        }
    }