繁体   English   中英

在 Spring Boot 中使用 spring.application.json 作为 application.properties 文件

[英]using spring.application.json for application.properties file in spring boot

我正在尝试使用 spring 文档中的命令-Dspring.application.json='{"foo":{"bar":"spam"}}'但在 IntelliJ 的运行命令中看到它时,它总是失败, Could not resolve placeholder

我尝试使用系统变量和 Java Ops 变量但没有成功。

我的代码明智:Application.properties:

testing=${foo.bar}

应用程序.java

@SpringBootApplication
@ComponentScan
public class Application extends RepositoryRestMvcConfiguration {

    @Value("${testing:}")
    private String input;

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

    @Bean
    public BatchDetails set() {
        System.out.println("input: " + input);
        return new BatchDetails("Test", "Test2");
    }
}

IntelliJ VM 选项: -Dspring.application.json='{"foo":{"bar":"spam"}}'

IntelliJ 环境变量: SPRING_APPLICATION_JSON = '{"foo":{"bar":"spam"}}'

在应用程序启动时,我得到以下堆栈跟踪:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'foo.bar' in string value "${foo.bar}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:204) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:178) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.resolveNestedPlaceholders(AbstractPropertyResolver.java:195) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:87) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:60) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.core.env.AbstractEnvironment.getProperty(AbstractEnvironment.java:531) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$1.getProperty(PropertySourcesPlaceholderConfigurer.java:132) ~[spring-context-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$1.getProperty(PropertySourcesPlaceholderConfigurer.java:129) ~[spring-context-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:84) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.core.env.PropertySourcesPropertyResolver.getPropertyAsRawString(PropertySourcesPropertyResolver.java:70) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver$1.resolvePlaceholder(AbstractPropertyResolver.java:207) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:153) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:204) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:178) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172) ~[spring-context-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:808) ~[spring-beans-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1027) ~[spring-beans-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) ~[spring-beans-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545) ~[spring-beans-4.2.3.RELEASE.jar:4.2.3.RELEASE]
... 80 common frames omitted

我只是将配置放在错误的位置才能正常工作吗?

您不能像那样“扩展”Spring 的application.properties 那里的所有值和系统级spring.application.json都加载到您的Environment变量中,您可以从那里访问foo.bar

所以,基本上..

Spring 从您的application.properties进行testing ,期望一个完整的值,然后从您的 System 变量中获取 JSON,期望一个完整的值并将它们合并到Environment

现在你可以做

@Autowired
private Environment env;

env.getProperty("testing");
env.getProperty("foo.bar");

//OR
@Value(${"foo.bar"})
private String valueFromFooBar

我尝试将-Dspring.application.json='{"foo":{"bar":"spam"}}'到我的测试中,但它没有正确解析。 你可以试试--spring.application.json={\\"foo\\":\\"bar\\"} ,效果很好;

实际上,spring在运行时,会将配置选项解析到环境中,就像图片一样。首先,将commandarguements解析为PropertySource name='commandLineArgs' ,然后,通过SpringApplicationJsonEnvironmentPostProcessor ,拆分spring.application.json的值变成一个孤独的 PropertySource 名字spring.application.json

由 SpringApplicationJsonEnvironmentPostProcessor 解析

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM