如何在Spring启动应用程序中的manifest.yml中读取目标?

时间:2017-04-24 10:28:13

标签: java spring-boot cloudfoundry

我有一个函数可以将硬编码的URL返回到目标。我想在manifest.yml文件中定义目标网址,并从那里读取网址。

这是我的manifest.yml

applications:
  - name: rule_runtime 
    buildpack: java_buildpack
    path: target/com.sap.brms.web.app.0.0.1-SNAPSHOT.war
    env:
      TARGET_RUNTIME: tomcat
      destinations: [  {"name":"bpmrulesrepository", "url":"https://example.com"}]

从这个文件中,我想在启动应用程序时获得值https://example.com。我一直在尝试System.getenv("bpmrulesrepository"),但它正在返回null

2 个答案:

答案 0 :(得分:0)

您的manifest.yml文件告诉cf cli如何部署您的应用程序。您可以在此处输入配置,但,因为您的manifest.yml文件可用于定义环境变量。换句话说,您的manifest.yml文件可用于设置特定的环境变量,您的应用程序稍后可以从中读取配置值。您的申请无法直接阅读manifest.yml

例如,如果这是您的manifest.yml文件:

applications:
  - name: rule_runtime 
    buildpack: java_buildpack
    path: target/com.sap.brms.web.app.0.0.1-SNAPSHOT.war
    env:
      TARGET_RUNTIME: tomcat
      destinations: [  {"name":"bpmrulesrepository", "url":"https://example.com"}]

然后你告诉cf cli定义两个环境变量:

  1. TARGET_RUNTIME,其值为tomcat
  2. destinations,其值为[ {"name":"bpmrulesrepository", "url":"https://example.com"}]
  3. 因此,如果你想获得url密钥,你需要首先获取destinations env变量的内容,解析它(看起来像JSON),然后读取{的值{1}}。

    正如斯科特在上面的评论中提到的,您可以通过定义环境变量来节省一些工作,以便应用程序更容易阅读它们。例如,如果您将url设置为destinations_bpmrulesrepository_url,那么您需要做的就是阅读一个env变量并获得您的网址。

    对于它的价值,您可能还想将配置放在https://example.comapplication.properties内。你有一个Spring Boot应用程序,所以这通常是你的配置。另外,因为它是Spring Boot,所以如有必要,您可以通过环境变量轻松覆盖这些文件中的配置设置。

    https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

答案 1 :(得分:-1)

您需要引用yaml文件。 您应该在Spring启动应用程序中添加此配置类。

 package xyx.partas.provider.lezzgoshop.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.FileSystemResource;

import java.io.File;

/**
 * Created by afernandez on 16/09/2016.
 */
@Configuration
@Slf4j
public class AppConfig {


    private static String YML_FILE = "manifest.yml";
    //Change the path
    public static final String DEFAULT_ETC_DIR = "/etc/partas-config";
    /**
     * The default etc directory can be overridden by setting the CORE_API_ETC environment variable.
     */
    public static final String CUSTOM_ETC_DIR_VAR = "CORE_API_ETC";

    @Bean
    public static PropertySourcesPlaceholderConfigurer properties() {

        final String envEtcDir = System.getenv(CUSTOM_ETC_DIR_VAR);
        final String configDir = (envEtcDir == null) ? DEFAULT_ETC_DIR : envEtcDir;

        final String configFile = configDir + File.separatorChar + YML_FILE;
        log.info("Looking up configuration file: {}", configFile);
        File ymlFile = new File(configFile);
        PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
        YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
        if (ymlFile.exists()) {
            log.info("Loading Configuration File: {}", ymlFile.getAbsoluteFile());

            yaml.setResources(new FileSystemResource(configFile));
            propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
        } else {
            log.info("Using project default Configuration File");
            //yaml.setResources(new ClassPathResource("application-default.yml"));
           // propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
        }

        return propertySourcesPlaceholderConfigurer;
    }


}

从那里,您可以注入环境Bean。

 @Autowired
 public Environment environment;

从注入的bean中,您可以像这样引用已定义的属性。 environment.getProperty( “thePropertyKey”);