【发布时间】:2020-02-28 00:49:06
【问题描述】:
我有两个 Spring Boot 应用程序。第一个是一个 API 库,它作为依赖 jar 被拉入第二个(Web 应用程序)。
第一个是一个 API 库,其中包含用于在 IBM 解决方案中创建“案例”的函数。它是一个独立类型的 jar,具有一个服务类,该类公开 getCaseXMLForDocId(String docId) 或 createCaseForAgreementNumber(String agreementNumber) 等方法
第一个名为 CaseInvocationAPI 的库有一个 application.properties 文件,该文件具有多个属性。例如:
caseinvocation.query.fetchNonProcessedCaseXml=SELECT Id, CaptureSource, AgreementNumber, CaptureSourceID FROM CaseInvocation WHERE ProcessIndicator IN (0, 2)
服务类有一个查询方法,从一个成员变量中获取查询字符串,该成员变量填充了 application.properties 文件中的属性:
@Value("${caseinvocation.query.fetchNonProcessedCaseXml}")
private String selectNonProcessedQueryString;
第二个 SpringBoot 应用程序是一个具有 REST 控制器的 Web 应用程序。这些控制器公开调用 CaseInvocationAPI 库的端点,特别是 CaseInvocationService 类。
我遇到的问题是,当 SpringBoot WEBAPPLICATION 启动时,上下文配置爆炸并出现以下错误:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'caseinvocation.query.fetchNonProcessedCaseXml' in string value "${caseinvocation.query.fetchNonProcessedCaseXml}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:219)
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:193)
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:813)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1039)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:566)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:349)
... 45 common frames omitted
似乎当 WebApp 启动时,当它尝试从依赖 jar 构建类时,没有找到这些属性。
我认为我不必将依赖 jar application.properties 文件中的每个属性都复制到 Webapp 项目中的 application.properties 文件中。
为什么 WebApp 项目 (CaseInvocationWebApp) 没有从依赖的 jar 文件 (CaseInvocationAPI) 中提取 application.properties 文件?
我检查了已编译的 jar 文件 (CaseInvocationAPI),并且 application.properties 文件在 jar 中。
【问题讨论】:
-
哦,如果我复制以下行:``` caseinvocation.query.fetchNonProcessedCaseXml=SELECT Id, CaptureSource, AgreementNumber, CaptureSourceID FROM CaseInvocation WHERE ProcessIndicator IN (0, 2) ``` 来自应用程序API jar 项目中的.properties 文件并将其放入WebApp 项目中,找到并设置属性。但是我不应该将所有属性从一个文件复制到另一个文件,对吗? springboot不应该简单地从类路径上的依赖jar中拉入applications.property文件吗?
-
您的第二个 jar(REST webapp)是否也有 application.properties?如果是这样,它将加载此文件并忽略第一个 jar 中的另一个,因为您是从第二个 jar 启动应用程序。看看这个question,它看起来和你想做的很相似。
-
是的。两个 jar 都有一个 application.properties 文件。我没有意识到它用另一个覆盖了一个。很高兴知道。感谢您的回答!
标签: java spring-boot application.properties