一尘不染

Spring Boot-Application.properties中的自定义变量

spring-boot

我有使用一个宁静的api的spring boot客户端。不用在Java类中对REST
API的IP地址进行硬编码,我可以使用application.properties中的任何键条目吗?

如果没有,我可以创建一个自定义条目吗?

谢谢


阅读 1129

收藏
2020-05-30

共1个答案

一尘不染

Spring
Boot使用的基础架构可以完全相同的方式用于您自己的项目中。您在@zmitrok答案中评论了有关“未知属性”警告的信息。那是因为您的属性没有元数据,所以IDE对此一无所知。

我强烈建议您 不要 使用@Value,因为与Spring Boot提供的功能(@ValueSpring框架功能)相比,它受到了很大的限制。

首先为您的IP创建一些POJO:

@ConfigurationProperties("app.foo")
public class FooProperties {

    /**
     * IP of foo service used to blah.
     */
    private String ip = 127.0.0.1;

    // getter & setter
}

那你有两个选择

  1. @ComponentFooProperties,并通过添加使配置属性的处理@EnableConfigurationProperties上你的任何@Configuration类(这最后一步,不再是必要的,因为spring启动的1.3.0.M3
  2. 保持FooProperties原样并添加@EnableConfigurationProperties(FooProperties.class)到您的任何@Configuration类中,这将为您自动创建一个Spring Bean。

完成后,app.foo.ipapplication.properties可以@Autowired
FooProperties在代码中使用它,并可以在代码中查找属性的值

@Component
public MyRestClient {

    private final FooProperties fooProperties;

    @Autowired
    public MyRestClient(FooProperties fooProperties) { ... }

    public callFoo() {
       String ip = this.fooProperties.getIp();
       ...
    }

}

好的,所以您的IDE中的密钥仍然是黄色的。最后一步是添加一个额外的依赖关系,该依赖关系将在构建时查找您的代码并生成相关的元数据。将以下内容添加到您的pom.xml中

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

而且,您的密钥被识别,您拥有javadoc,并且IDE为您提供了默认值(您在字段上初始化的值)。一旦可以使用任何类型,转换服务就会处理(即URL),并且字段上的javadoc用于生成密钥的文档。

您还可以JSR-303在字段上添加任何约束验证(例如,使用正则表达式来检查其是否为有效ip)。

检查此示例项目文档以获取更多详细信息。

2020-05-30