Spring Boot如何选择外部化的Spring属性文件

时间:2019-03-29 08:14:04

标签: java spring spring-boot

我有此配置,需要用于Spring Boot应用程序。

java -jar app.jar --spring.config.location=classpath:/another-location.properties  

默认情况下,spring-boot会拾取src / main / resources /

中的application.properties文件。

我想更改此路径并将Spring Boot引导到其他application.properties文件

我可以使用

实现
   @PropertySource("file:C:\Users\test\.test\test.properties")
    @ConfigurationProperties(prefix = "spring")
    public class Configuration {

        private String ddlAuto;

        private String url;

        private String username;

        private String password;

        private String driverClassName;
    }

在不通过命令行传递args的情况下,是否有其他解决方案可以实现?

我在用这个

@SpringBootApplication
@EnableConfigurationProperties(Configuration.class)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

在我的主班上

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target org.springframework.boot.context.properties.bind.BindException: 

在我尝试执行该应用程序之后,在src / main / resources /下的application.properties中注释掉了所有数据源属性 但是它一直给我以下错误,并且应用程序无法启动

我指的是本教程:https://www.mkyong.com/spring-boot/spring-boot-configurationproperties-example/

但是正如提到的那样,当我启动spring boot应用程序时出现此错误

curl https://localhost/input.php --insecure -L --form "id=myId" --form "file[]=@/tmp/myFile"

对此将有任何帮助

2 个答案:

答案 0 :(得分:2)

具有外部化属性的推荐方法是使用spring.config.location系统属性,如下所示启动应用程序:

obj

之所以这样做,是因为您没有在代码和文件系统层次结构之间添加耦合。

在Spring Boot 2.0之前,此属性是可加的,这意味着它将补充默认位置。在Spring Boot 2.0之后,spring.config.location将替换默认位置(例如classpath src / main / resources / application.properties)。要在2.0之后保持可加性,请改用spring.config.additional-location。

请在此处查看official documentation

答案 1 :(得分:0)

我能够使其在Spring Boot 2.1.2.RELEASE上正常工作。这是我所做的: 我的test.properties文件夹中有一个/tmp,其中包含以下内容:

test.myprop=hello

我在资源文件夹中也有通常的属性文件:

myprop=world

我为自定义属性文件创建了一个类:

@Configuration
@PropertySource("file:/tmp/test.properties")
@ConfigurationProperties(prefix = "test")
public class TestConfig {

    private String myprop;

    public String getMyprop() {
        return myprop;
    }

    public void setMyprop(String myprop) {
        this.myprop = myprop;
    }
}

然后在主类中,我启用了配置属性:

@EnableConfigurationProperties(TestConfig.class)
@SpringBootApplication
public class MyApp {

    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }

}

现在我有这个测试控制器:

@RestController
public class TestController {

    @Value("${test.myprop}")
    private String externalisedProp;
    @Value("${myprop}")
    private String prop;

    @GetMapping("test")
    public void test() {
        System.out.println("externalised: " + externalisedProp);
        System.out.println("not externalised" + prop);
    }
}

哪个曾经被正确地打印:

externalised: hello
not externalised: world

我的TestConfig类与MyApp主类位于同一包中。 我所做的与您的解决方案非常相似,几乎相同,您确定路径正确吗?另外,我可以看到属性文件的内容与config类中的内容不匹配,前缀有所不同。也许是问题所在?

编辑: 我试图从属性类中删除@Configuration批注(您也没有),它不再能够选择外部化的属性。错误虽然有所不同,但您应该尝试添加它。