Spring Boot App未从依赖的jar中获取application.properties

时间:2019-11-01 18:18:35

标签: java spring-boot application.properties

我有两个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文件。

2 个答案:

答案 0 :(得分:1)

问题似乎与子jar和webapp都具有application.properties文件这一事实有关。我不知道父级WebApp application.properties会覆盖其他(实际上忽略所有其他)。

特别感谢Paschoal的回应。

您可以在此处查看有关答案的详细信息: Adding multiple application.properties files

答案 1 :(得分:1)

有3种方法(我可以想到)可以实现:

  1. 依赖项API库不应具有application.properties,因为它是一个库,本身不是可执行的Spring Boot应用程序。您仅在Web应用程序的application.properties中定义属性,即使对于API库也是如此。 但是,这里的假设是您有权访问API库jar。

  2. 您可以在Web应用程序的application.properties中重新定义本质上覆盖它们的所有属性。

  3. 将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);
  }
}