当前位置: 首页 > 面试题库 >

带有PropertyPlaceholderConfigurer Bean的Spring @Configuration文件无法解析@Value批注

颜志业
2023-03-14
问题内容

我有以下配置文件:

@Configuration
public class PropertyPlaceholderConfigurerConfig {

    @Value("${property:defaultValue}")
    private String property;

    @Bean
    public static PropertyPlaceholderConfigurer ppc() throws IOException {
        PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        ppc.setLocations(new ClassPathResource("properties/" + property + ".properties"));
        ppc.setIgnoreUnresolvablePlaceholders(true);
        return ppc;
    }
}

我使用以下VM选项运行应用程序:

-Dproperty=propertyValue

因此,我希望我的应用程序在启动时加载特定的属性文件。但是由于某些原因,@Value目前未处理注释,属性为null。另一方面,如果我已经PropertyPlaceholderConfigurer通过xml文件进行了配置,那么一切都会按预期进行。Xml文件示例:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="location">
        <value>classpath:properties/${property:defaultValue}.properties</value>
    </property>
</bean>

如果我尝试将属性值注入到另一个Spring配置文件中-
它已正确注入。如果将我的PropertyPlaceholderConfigurerbean创建移动到该配置文件-字段值再次为null。

解决方法是,使用以下代码行:

System.getProperties().getProperty("property", "defaultValue")

哪一个也可以,但是我想知道为什么会发生这种行为,也许可以用其他方式重写它而不使用xml?


问题答案:

从Spring JavaDoc:

为了使用PropertySource的属性解析$
{…}占位符在定义或@Value注释中,必须注册一个PropertySourcesPlaceholderConfigurer。在XML中使用时会自动发生,但是在使用@Configuration类时必须使用静态@Bean方法显式注册。有关详细信息和示例,请参见@Configuration的javadoc的“使用外部化的值”部分和@Bean的javadoc的“关于BeanFactoryPostProcessor-
返回@Bean方法的说明”。

因此,您正在尝试在启用占位符处理所需的代码块中使用占位符。

如@ M.Deinum所述,您应该使用PropertySource(默认或自定义实现)。

下面的示例显示如何在PropertySource批注中使用属性,以及如何从字段中的PropertySource注入属性。

@Configuration
@PropertySource(
          value={"classpath:properties/${property:defaultValue}.properties"},
          ignoreResourceNotFound = true)
public class ConfigExample {

    @Value("${propertyNameFromFile:defaultValue}")
    String propertyToBeInjected;

    /**
     * Property placeholder configurer needed to process @Value annotations
     */
     @Bean
     public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
     }
}


 类似资料:
  • 这是我用来读取gradle项目中的application.properties文件的代码。 我的文件位于中 这就是我试图在IntelliJ中运行应用程序的方式

  • 我曾在其他项目中工作过,我只是重新做同样的事情,但由于某些原因,它不起作用。Spring不是从属性文件读取,而是从字面上取值 AppConfig.java ApplicationContext.xml: AppConfig.Properties 想法?

  • 问题内容: 我有以下配置类: and I have service with property: 我想使用以下命令测试AppConfig配置类时收到错误消息 该问题记录在SPR-8539中 但无论如何,我无法弄清楚如何配置PropertySourcesPlaceholderConfigurer 使其正常工作。 编辑1 这种方法适用于xml配置 但我想使用Java进行配置。 问题答案: 如果使用@P

  • 我想对Spring Boot进行JUnit测试,如下所示: 应用程序est.java这样 我的POM是这样的: 当我运行测试时,我得到了以下错误信息 但是当我以普通Java应用程序的形式运行这个应用程序时 它工作得很好! 它怎么了?我应该如何使用Spring Boot进行jUnit测试?非常感谢!

  • 本文向大家介绍Spring @value和@PropertySource注解使用方法解析,包括了Spring @value和@PropertySource注解使用方法解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Spring @value和@PropertySource注解使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考

  • 我试图实现一个第三方的SDK捆绑包时,我运行我得到了以下错误: 任务“:app:checkDebugarMetadata”的执行失败。 无法解析配置“:app:debugRuntimeClasspath”的所有文件。 无法解析com。ts.auth-control-sdk:5.1.1。要求:项目:应用 sun.security.provider.certpath.SunCertPathBuilde