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

问题描述 投票:0回答:4

我有使用 Restful api 的 Spring Boot 客户端。我可以使用 application.properties 中是否有任何关键条目,而不是在 java 类中硬编码 REST API 的 IP 地址?

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

谢谢

spring spring-mvc spring-boot spring-data
4个回答
121
投票

Spring Boot 使用的基础设施可以以完全相同的方式在您自己的项目中使用。您在 @zmitrok 回答中评论了“未知属性”警告。这是因为您的属性没有元数据,因此 IDE 不知道它。

如果可以的话,我强烈建议您不要使用

@Value
,因为与 Spring Boot 提供的功能相比,它相当有限(
@Value
是 Spring 框架功能)。

首先为您的 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. @Component
    放在
    FooProperties
    上,并通过在任何
    @EnableConfigurationProperties
    类上添加
    @Configuration
    来启用配置属性的处理(从 Spring Boot
    1.3.0.M3
    开始,不再需要最后一步)
  2. 保留
    FooProperties
    不变,并将
    @EnableConfigurationProperties(FooProperties.class)
    添加到任何
    @Configuration
    类,这将自动为您创建一个 Spring Bean。

完成后,

app.foo.ip
可以在
application.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)。

查看此示例项目文档了解更多详细信息。


23
投票

您可以使用

启动应用程序,而不是将 IP 硬编码到属性文件中

-Dmy.property=127.127.10.20

Spring Boot 会自动选择它

@Value("${my.property}")
private String myProperty;

4
投票

您可以将自己的条目添加到 application.properties 中。只需确保属性名称不会与 http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties

中列出的通用属性冲突

0
投票

我也面临着同样的问题。由于所有答案都是 2015 年的,我尝试更新这个主题。

假设以下是您在 application.yml 中的自定义属性:

custom:
  client: "http://localhost:4200"

您可能会收到警告

无法解析配置属性“custom.client”

要解决此问题,您可能需要在 resources/META-INF 中创建文件 additional-spring-configuration-metadata.json。完成后,将以下内容添加到创建的文件中:

{
  "properties": [
    {
      "name": "custom.client",
      "type": "java.lang.String",
      "description": "Client's URL."
  }
] }

警告应该消失了。

© www.soinside.com 2019 - 2024. All rights reserved.