我有两个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),并且jar中存在application.properties文件。
答案 0 :(得分:1)
问题似乎与子jar和webapp都具有application.properties文件这一事实有关。我不知道父级WebApp application.properties会覆盖其他(实际上忽略所有其他)。
特别感谢Paschoal的回应。
您可以在此处查看有关答案的详细信息: Adding multiple application.properties files
答案 1 :(得分:1)
有3种方法(我可以想到)可以实现:
依赖项API库不应具有application.properties
,因为它是一个库,本身不是可执行的Spring Boot应用程序。您仅在Web应用程序的application.properties
中定义属性,即使对于API库也是如此。
但是,这里的假设是您有权访问API库jar。
您可以在Web应用程序的application.properties
中重新定义本质上覆盖它们的所有属性。
将Spring Boot应用程序显式配置为使用两个application.properties
文件,每个文件具有不同的属性集。
注意:文件名必须不同,因为配置位置都是两者的类路径。
@SpringBootApplication
public class WebApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplicationBuilder(WebApplication.class)
.properties("spring.config.location=classpath:api-application.properties,classpath:application.properties")
app.run(args);
}
}