英文:
get springboot application.properties env variables into config class
问题
以下是您要翻译的内容:
I am struggling to create a config
class that holds final strings of configuration properties that I use elsewhere. I don't want to use the Environment
. So I have some code
@Autowire
Environment env;
return this webClient.get()
.uri(uriBuilder -> uriBuilder.path(env.getProperty("endpoint")).build())
.accept(MediaType.TEXT_EVENT_STREAM)
.exchangeToFlux(e -> e.bodyToFlux(Event.class));
That's actually working fine, but I want to get my config together in a separate class, out of the environment. Like:
@Configuration
@PropertySource("classpath:application.properties")
public class MyConfig {
@Value("${endpoint}")
public static final String URI = ""
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}
}
In my springboot project when I change from env
to use the MyConfig
variable:
return this webClient.get()
.uri(uriBuilder -> uriBuilder.path(MyConfig.URI).build())
.accept(MediaType.TEXT_EVENT_STREAM)
.exchangeToFlux(e -> e.bodyToFlux(Event.class));
When I get a unit test going that's going to run the call to the URI
config from the MsgConfig
class it's always null. How can I get the thing to populate?
UPDATE
It looked as if removing the static
from
public static final String URI = "";
and @Autowire
the MyConfig
class into the other class was going to work, and indeed sometimes it does, but this appears to cause a race condition whether the URI is set or not...
英文:
I am struggling to create a config
class that holds final strings of configuration properties that I use elsewhere. I don't want to use the Environment
. So I have some code
@Autowire
Environment env;
return this.webClient.get()
.uri(uriBuilder -> uriBuilder.path(env.getProperty("endpoint")).build())
.accept(MediaType.TEXT_EVENT_STREAM)
.exchangeToFlux(e -> e.bodyToFlux(Event.class));
That's actually working fine, but I want to get my config together in a separate class, out of the environment. Like:
@Configuration
@PropertySource("classpath:application.properties")
public class MyConfig {
@Value("${endpoint}")
public static final String URI = "";
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}
}
In my springboot project when I change from env
to use the MyConfig
variable:
return this.webClient.get()
.uri(uriBuilder -> uriBuilder.path(MyConfig.URI).build())
.accept(MediaType.TEXT_EVENT_STREAM)
.exchangeToFlux(e -> e.bodyToFlux(Event.class));
When I get a unit test going that's going to run the call to the URI
config from the MsgConfig
class it's always null. How can I get the thing to populate?
UPDATE
It looked as if removing the static
from
public static final String URI = "";
and @Autowire
the MyConfig
class into the other class was going to work, and indeed sometimes it does, but this appears to cause a race condition whether the URI is set or not...
答案1
得分: 1
我建议使用一个配置属性类,如Spring Boot文档中所述。首先,创建一个类来保存配置属性:
@ConfigurationProperties("endpoint")
public class EndpointProperties {
private final URI uri;
public EndpointProperties(URI uri) {
this.uri = uri;
}
public URI getUri() {
return this.uri;
}
}
然后,使用文档中描述的其中一种技术来启用EndpointProperties
。
然后,将它注入到需要这些属性的类中:
@Autowired
EndpointProperties endpoint;
return this.webClient.get()
.uri(uriBuilder -> uriBuilder.path(endpoint.getUri()).build())
.accept(MediaType.TEXT_EVENT_STREAM)
.exchangeToFlux(e -> e.bodyToFlux(Event.class));
在Spring Boot的application.yml
文件中,你可以设置属性值如下:
endpoint:
uri: https://example.com/api/
英文:
I would suggest using a configuration properties class, as described in the Spring Boot documentation.
First, create a class to hold the configuration properties:
@ConfigurationProperties("endpoint")
public class EndpointProperties {
private final URI uri;
public MyProperties(URI uri) {
this.uri = uri;
}
public URI getUri() {
return this.uri;
}
}
Then enable the EndpointProperties
using one of the techniques described in the documentation.
You can then inject this into the class that needs the properties:
@Autowired EndpointProperties endpoint;
return this.webClient.get()
.uri(uriBuilder -> uriBuilder.path(endpoint.getUri()).build())
.accept(MediaType.TEXT_EVENT_STREAM)
.exchangeToFlux(e -> e.bodyToFlux(Event.class));
In a Spring Boot application.yml
file, you'd set the property value like this:
endpoint:
uri: https://example.com/api/
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论