【问题标题】:Backslash (\) in .proprties file is being ignored by Spring's 'Environment' variable.properties 文件中的反斜杠 (\) 被 Spring 的“环境”变量忽略
【发布时间】:2016-10-17 21:54:24
【问题描述】:

我正在尝试使用 @PropertySourceEnvironment 变量在 Spring @Configuration java 类中加载 config.proprties 文件数据。

示例:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/PropertySource.html 问题是,我有一个属性,其值如下:

     serverName = abc\xyz

当我通过 using 方法读取这个属性时,

     String server= env.getProprty("serverName");
     System.out.print(server);

值打印为“abcxyz”。

请注意,我尝试使用双反斜杠,例如,

     serverName = abc\\xyz

但它仍然只是从值字符串中忽略 \。 我也不能用正斜杠代替反斜杠。

你能帮我修一下吗?提前致谢!!

【问题讨论】:

  • 也许 / - 正常的斜线 - 会做,因为 Windows 通常是 POSIX 兼容的。
  • 在属性文件中,\需要在属性文件中转义 \\(参见docs.oracle.com/cd/E23095_01/Platform.93/ATGProgGuide/html/…)。它未打印的事实并不一定意味着它不存在,它可以通过打印再次解释为转义字符。由于\x 不是任何东西(afaik),它会删除它。
  • 不,它没有读取 \,因为我在进一步处理 d 值时遇到异常
  • @Sanjeev 你找到解决这个问题的方法了吗?
  • 这仍然是一个悬而未决的问题。

标签: java spring spring-annotations spring-web


【解决方案1】:

这是一个非常丑陋的 hack,但您可以尝试对符号“\”使用 unicode 转义序列,即“\u005c”,因此使用“abc\u005cxyz”代替字符串值“abc\xyz”。但话又说回来,它会将其转换为“abc\xyz”,然后将“\”视为转义符号的开始。因此,如果第一个不起作用,您可以尝试将“abc\\xyz”替换为“abc\u005c\u005cxyz”。看看第一个或第二个选项是否适合您。但事实上,我很惊讶简单的转义“\\”并没有解决你的问题。此外,如果一切都失败了,试试这个 "abc\\\\xyz" - 这是双重转义。

【讨论】:

    【解决方案2】:

    我使用了 spring 3.1.4-RELEASE,如果属性文件中的值包含“\\”,它就可以工作。像 serverName = abc\\xyz

    package com.test;   
    
    import org.springframework.beans.factory.annotation.Autowired;  
    import org.springframework.context.annotation.Bean; 
    import org.springframework.context.annotation.Configuration;    
    import org.springframework.context.annotation.PropertySource;   
    import org.springframework.core.env.Environment;    
    
    @Configuration  
    @PropertySource("app.properties")   
    public class AppConfig {    
    
        @Autowired  
        Environment env;
    
        @Bean   
        public String myBean() {    
            System.out.println(env.getProperty("serverName"));
            return new String(env.getProperty("serverName"));   
        }   
    }
    

    【讨论】:

      【解决方案3】:

      我没有使用反斜杠,而是将它们用正斜杠存储在配置文件中。

      在阅读时,我将它们替换为双反斜杠。

      SourcePath=C:/Users/Barani/Documents/SampleData/MyInputFile.txt

          Path currentRelativePath = Paths.get("");
          String filePath = currentRelativePath.toAbsolutePath().toString() + "/config.properties";
          Properties props = new Properties();
          FileInputStream fis = new FileInputStream(filePath);
          props.load(fis);
          sourcePath = props.getProperty("SourcePath").replace("/", "\\\\");
      

      这对我来说是正确的。

      【讨论】:

        猜你喜欢
        • 2020-03-31
        • 2021-10-15
        • 2012-05-06
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        • 2021-08-05
        • 2014-04-25
        相关资源
        最近更新 更多