【问题标题】:Static variable set to null by @Value@Value 将静态变量设置为 null
【发布时间】:2017-04-10 09:06:51
【问题描述】:

我的常量文件:

 @Component
    public class Constants {
        public static String ROOT_DOMAIN;
        @Value("${setting.rootDomain}")
        private void setRootDomain(String rootDomain) {
            ROOT_DOMAIN = rootDomain;
        }
    ...
    }

我的 settings.properties:

setting.rootDomain=example.com

我的推荐类和方法:

@Component
public class MyServiceClass
{
        public void doSomething()
        {
           System.out.println("Root is:" + Constants.ROOT_DOMAIN);
        }
}

但 Root Domain 将作为 null 出现

[更新] 我的 spring-master.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath*:/META-INF/spring/local/settings.properties</value>
                <value>classpath*:/META-INF/spring/${DEPLOY_ENVIRONMENT}/settings.properties</value>                        
            </list>
        </property>

        <property name="ignoreUnresolvablePlaceholders" value="true"/>
        <property name="ignoreResourceNotFound" value="true" />
        <property name="searchSystemEnvironment" value="true" />
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    </bean>
    <context:component-scan base-package="com.myapp.app">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>  
    </context:component-scan>
    <context:component-scan base-package="com.myapp.app.dao.api" />

    <!-- Application Context Provider -->
    <bean id="appContextProvider" class="com.myapp.app.ApplicationContextProvider"/>

</beans>

而ApplicationContextProvider类如下:

@Component
public class ApplicationContextProvider implements ApplicationContextAware {

     private static ApplicationContext context;

     public static ApplicationContext getApplicationContext() {
         return context;
     }

     @Override
     public void setApplicationContext(ApplicationContext ctx) {
         context = ctx;
     }
}

是的,文件在类路径中

【问题讨论】:

  • 这看起来像是弹簧上下文配置错误。它看起来如何,您的项目结构是什么?
  • 您是否尝试将 setRootDomain 可见性更改为公开?您确定属性文件在类路径中吗?
  • 你直接访问变量而不自动装配Constants bean,你希望Spring什么时候初始化那个bean?
  • @Catalin 添加了配置
  • @PiotrSołtysiak 静态变量已设置为公共

标签: java spring


【解决方案1】:

@Value() 在 bean 的初始化时被调用,bean 不需要在启动时被初始化,所以除非 bean 被初始化,否则你将没有值

【讨论】:

  • 有什么方法可以在启动时获得它?因为后来似乎我能够在其他一些类中甚至在相同的方法中将常量设置为正确的值。
  • 是的,当 bean 初始化时,您将能够获取该值,直到那时它将为 null
【解决方案2】:

我通过将@DependsOn 注释添加到我的注释@Bean 来解决这个问题,如此处所述Order of Configuration in SpringBoot

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2014-03-24
    相关资源
    最近更新 更多