2015-01-26 26 views
2

我想用ENV設置覆蓋application.properties中的任何屬性。在我的應用程序中,我使用DOT「」前綴「來定義屬性。」和後綴「破折號」(例如「 - 」)。Spring Boot:如何在Linux ENV .profile上用短劃線「 - 」覆蓋屬性?

例如:

application.server.jgroups-port= some port #

現在,我要覆蓋從OS ENV設置該屬性。

在Windows上,當我設置這個ENV屬性,這是我的結果:

第一(失敗),

Windows ENV >> APPLICATION_SERVER_JGROUPS_PORT = 5445 

environment.getProperty("application.server.jgroups-port") returns NULL 

二(失敗),

Windows ENV >> APPLICATION_SERVER_JGROUPSPORT = 5445 

environment.getProperty("application.server.jgroups-port") returns NULL 

三(THIS WORKS!),

Windows ENV >> APPLICATION_SERVER_JGROUPS-PORT = 5445 

environment.getProperty("application.server.jgroups-port") returns 5445 

請注意,最後一個「破折號」(例如「 - 」)。

YAY!我已經使用「短劃線」有效地設置了Windows ENV的屬性。 Spring Boot將此ENV完美地映射到應用程序屬性。但是,在Linux中,它不接受ENV中的「破折號」(例如「 - 」),因此當我使用Windows上使用的相同方法時,我的.profile文件爆炸了。>> APPLICATION_SERVER_JGROUPS-PORT = 5445.我需要做什麼來使Linux ENV設置設置我的「application.server.jgroups-port」屬性?

編輯: 它看起來像org.springframework.core.env.SystemEnvironmentPropertySource是我需要做一些工作來支持Java中的虛線屬性名稱作爲Linux ENV。例如,在SystemEnvironmentPropertySource到getProperty("somePrefix.foo-suffix") = APPLICATION_SERVER_JGROUPS_PORT通話就像它有一個週期 - getProperty("somePrefix.foo.suffix")

+0

它看起來像org.springframework.core.env.Sy stemEnvironmentPropertySource是我需要做一些工作的地方...就像不知何故,支持 – Jason 2015-01-27 22:49:20

回答

0

這是我如何解決這個問題。

  1. I子類,SystemEnvironmentPropertySource.java。
  2. 我重寫了getProperty(name)並複製了父母的'resolvePropertyName()'代碼來進行修復。它是私有的,所以我不能只重寫'resolvePropertyName()',這會更容易。
  3. 請參閱下面的resolvePropertyName()代碼片段。
  4. 我創建了一個ApplicationListener並將其註冊到我的Spring Boot應用程序中,以將此自定義PropertySource添加到MutablePropertySources的標準列表中。

這是變化的膽量。我認爲Spring應該在未來的版本中增加這個功能。

private String resolvePropertyName(String name) { 
     Assert.notNull(name, "Property name must not be null"); 
     if (containsKey(name)) { 
      return name; 
     } 

     String usName = name.replace('.', '_'); 
     if (!name.equals(usName) && containsKey(usName)) { 
      return usName; 
     } 

     String ucName = name.toUpperCase(); 
     if (!name.equals(ucName)) { 
      if (containsKey(ucName)) { 
       return ucName; 
      } 
      else { 
       String usUcName = ucName.replace('.', '_'); 
       if (!ucName.equals(usUcName) && containsKey(usUcName)) { 
        return usUcName; 
       } 

       // Jan. 27, 2015 - Jason 
       // Added this code to allow replacing a property with dashes to underscores 
       String usUcDashName = usUcName.replace("-", "_"); 
       if (containsKey(usUcDashName)) { 
        return usUcDashName; 
       } 
       // end modification to support dashes 
      } 
     } 

     return name; 
    } 

而JUnit展示了我需要發生的事情。最後的說法是我最初打開這個的。

@RunWith(BlockJUnit4ClassRunner.class) 
public class TestDashPropertySource extends TestCase{ 

    @Test 
    public void testConvertBashToDash() throws Exception { 
     Map<String, Object> mockBashENV = new HashMap<String, Object>(); 

     mockBashENV.put("APP_PREFIX_FOO", "foo"); 
     mockBashENV.put("APP_PREFIX_BAR", "bar"); 
     mockBashENV.put("APP_PREFIX_FOO_BAR", "foobar"); 

     SystemEnvironmentDashResolvingPropertySource ps = new SystemEnvironmentDashResolvingPropertySource("my-dash-handler",mockBashENV); 

     Object foo = ps.getProperty("app.prefix.foo"); 
     assertEquals("Did not find correct value", "foo", foo); 

     Object bar = ps.getProperty("app.prefix.bar"); 
     assertEquals("Did not find correct value", "bar", bar); 

     Object foobar1 = ps.getProperty("app.prefix.foo.bar"); 
     assertEquals("Did not find correct value", "foobar", foobar1); 

     Object foobar2_W_Dashes = ps.getProperty("app.prefix.foo-bar"); 
     assertEquals("Did not find correct value", "foobar", foobar2_W_Dashes); 
    } 

} 
0

它直接是不可能的,但你可以使用env程序。看到這個迴應https://unix.stackexchange.com/a/23714

+1

嗨 - 對不起,讓我更具體。我不想在Linux ENV vars中允許破折號的方法。相反,我正在通過Spring尋找一種解決方案,它將有效的Linux ENV變量轉換爲Spring屬性覆蓋 - 即使Spring屬性中有一個破折號「 - 」。 – Jason 2015-01-27 16:34:38

3

您還可以提供一個名爲SPRING_APPLICATION_JSON的環境變量,其中包含有效的JSON。這將允許您覆蓋具有特殊字符的鍵。例如:

export SPRING_APPLICATION_JSON='{"application.server.jgroups-port": 8080}'

這樣,你也可以覆蓋YAML這樣定義的數組:

foo.bar: 
    - 1 
    - 2 
    - 3 

有:

export SPRING_APPLICATION_JSON='{"foo.bar": ["4","5","6"]}'

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config

+0

SPRING_APPLICATION_JSON是相當新近的補充。你可能需要更新你的Spring Boot Parent才能使它工作。 – 2016-06-28 08:54:35

+0

誠然,它是1.3.x版本的一部分。 – jebeaudet 2016-07-05 15:20:57