我有使用 Restful api 的 Spring Boot 客户端。我可以使用 application.properties 中是否有任何关键条目,而不是在 java 类中硬编码 REST API 的 IP 地址?
如果没有,我可以创建自定义条目吗?
谢谢
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
}
那么你有两个选择
@Component
放在 FooProperties
上,并通过在任何 @EnableConfigurationProperties
类上添加 @Configuration
来启用配置属性的处理(从 Spring Boot 1.3.0.M3
开始,不再需要最后一步)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)。
您可以使用
启动应用程序,而不是将 IP 硬编码到属性文件中-Dmy.property=127.127.10.20
Spring Boot 会自动选择它
@Value("${my.property}")
private String myProperty;
您可以将自己的条目添加到 application.properties 中。只需确保属性名称不会与 http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties
中列出的通用属性冲突我也面临着同样的问题。由于所有答案都是 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."
}
] }
警告应该消失了。