【问题标题】:Spring Boot App not picking up application.properties from dependent jarSpring Boot App 未从依赖 jar 中获取 application.properties
【发布时间】: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


【解决方案1】:

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

特别感谢 Paschoal 的回复。

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

【讨论】:

    【解决方案2】:

    有 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);
      }
    }
    

    【讨论】:

    • 对我不起作用。首先,您在行尾缺少.build。其次,更重要的是,这会向环境中添加一个名为“spring.config.location”的属性,但实际上并未从该源加载任何属性。
    猜你喜欢
    • 2020-07-08
    • 2017-06-18
    • 2016-06-10
    • 2020-11-28
    • 1970-01-01
    • 2019-09-11
    • 2017-10-20
    • 2018-01-07
    • 2017-08-23
    相关资源
    最近更新 更多