代码之家  ›  专栏  ›  技术社区  ›  DigitalZebra

Spring@Value注释总是计算为空?

  •  27
  • DigitalZebra  · 技术社区  · 15 年前

    my.value=123
    another.value=hello world
    

    正在使用 PropertyPlaceHolderConfigurer ,它引用上面的属性文件。

    我有以下类,我正试图将这些属性加载到其中,以便:

    public class Config
    {
        @Value("${my.value}")
        private String mValue;
    
        @Value("${another.value}")
        private String mAnotherValue;
    
        // More below...
    }
    

    问题是, mValue mAnotherValue

    6 回复  |  直到 15 年前
        1
  •  39
  •   skaffman    15 年前

    如果实例 Config new ,那么Spring就不参与了,因此注释将被忽略。

    如果不能更改代码使Spring实例化bean(可能使用 prototype -作用域bean),则另一个选项是使用Spring的加载时类加载器编织功能(请参见 docs ). 这是一些低级的AOP,它允许您像平常一样实例化对象,但是Spring会将它们通过应用程序上下文进行连接、配置、初始化等。

    不过,它并不适用于所有平台,所以请阅读上面的文档链接,看看它是否适合您。

        2
  •  29
  •   Rob    12 年前

    我也有类似的问题,但对Spring来说是个新手。 我试图将属性加载到一个@Service中,并尝试使用@Value检索属性值。。。

    @Autowired
    public @Value("#{myProperties['myValue']}") String myValue;
    

    我花了一整天的时间尝试各种注释组合,但它总是返回空值。 最后,答案总是显而易见的。

    1) 通过包含包层次结构,确保Spring正在扫描类中的注释 在您的servlet.xml中(它将扫描您插入的基值下面的所有内容。

    2) 确保你不是刚告诉Spring要看的新课程。相反,在@Controller类中使用@Autowire。

    而是在@Controller中使用。。。

    @Autowired
    private MyService service; 
    

    正在调试。。。 有一件事我发现这是延长我的服务如下。。。

    @Service
    public class MyService implements InitializingBean 
    

    @Override
    public void afterPropertiesSet() throws Exception {
    // TODO Auto-generated method stub
    LOGGER.debug("property myValue:" + myValue);        
    }
    

    在这里,我可以看到初始化时设置的值,后来当我在一个方法中打印它时,它是空的,所以这对我来说是一个很好的线索,说明它不是同一个实例。

    导致这个错误的另一个线索是Tomcat抱怨试图从套接字读取的超时无法解析HTTPheader。。。这是因为Spring创建了一个服务实例,我也创建了一个服务实例,所以我的一个正在做真正的工作,Spring正在对其实例进行计时。

        3
  •  3
  •   Adeel Ansari    15 年前

    作为它的合作伙伴 @Controller ,似乎您正在实例化 Config 你自己。让Spring实例化它。

        4
  •  2
  •   kabal    14 年前

    添加 <context:spring-configured /> 应用程序上下文文件。

    然后添加 @Configurable Config 上课。

        5
  •  1
  •   Keiv    6 年前

    你也可以把你的财产 private @Service @Component 注释,因此它总是被实例化,最后添加注释为 @Value . 这将确保为属性分配application.properties或yml配置文件中指定的值。

    @Service
    public class Config {
        private static String mValue;
    
        private static String mAnotherValue;
    
        @Value("${my.value}")    
        public void setmValue(String mValue) {
        this.mValue = mValue;}
    
        @Value("${another.value}")
        public void setmAnotherValue(String mAnotherValue) {
        this.mAnotherValue = mAnotherValue;}
    
        //rest of your code...
    }
    
        6
  •  0
  •   scottysseus    7 年前

    看我的答案 here

    我也遇到了同样的症状( @Value null )但另一个根本问题是:

    import com.google.api.client.util.Value;

    确保导入正确的 @价值 注释类!尤其是现在ide的便利性,这是一个很容易犯的错误(我使用IntelliJ,如果你在不阅读自动导入内容的情况下自动导入太快,你可能会像我一样浪费几个小时)。