2010-11-09 100 views
14

所以,我有一个简单的性质使用以下条目文件:Spring @Value注释总是评估为null?

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... 
} 

的问题是,mValuemAnotherValue总是空...但在我的控制器,该值正在加载很好。是什么赋予了?

+0

Config类定义为spring bean吗? – Raghuram 2010-11-09 04:28:14

+0

不可以?我将如何做注释? – Polaris878 2010-11-09 04:39:15

+0

我试过在班上使用“@Component”和“@Controller”,都没有工作 – Polaris878 2010-11-09 04:57:14

回答

18

如果Config的实例正在通过new手动实例化,那么Spring不会涉及,因此注释将被忽略。

如果你不能改变你的代码,以使春实例化的bean(可能使用prototype -scoped豆),那么另一种选择是使用Spring的加载时织类加载器功能(见docs)。这是一些低级的AOP,它允许你像往常一样实例化对象,但是Spring会通过应用上下文来传递它们,以使它们连线,配置,初始化等。

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

+0

嗨skaffman,感谢您的建议......问题是我正在从JSP实例化'Config'。我不确定我能否找到解决办法?也许通过使用某种工厂? – Polaris878 2010-11-09 16:12:31

+0

@ Polaris878:我的建议仍然适用于JSP实例化对象(通过反射实例化的任何对象) – skaffman 2010-11-09 16:50:46

+0

+1。我详细地了解了Spring。多年没碰它了。愚蠢的工作场所。 – 2010-11-10 02:25:21

1

由于它与@Controller一起工作,看起来你自己实例化Config。让Spring实例化它。

+0

啊,是的,这是问题...我自己打电话给构造函数。那么,我可以访问这些属性吗?如果我无法访问这些属性,那基本上意味着我需要找到其他方式来加载配置,因为如果这些属性仅在某些情况下可用,则Spring属性加载器不会削减它。 – Polaris878 2010-11-09 05:04:55

+0

@ Polaris878:让Spring实例化它。我们有什么问题吗?或者使用'ResourceBundle'自己做。 – 2010-11-09 05:07:46

2

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

然后将@Configurable注释添加到Config类。

13

我有类似的问题,但是是春天的新手。 我试图性能加载到一个@Service,并试图用@Value检索与属性值...

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

我花了一整天试图注解的各种组合,但它总是返回null 。 最后,事实之后,答案一如既往显而易见。

1)确保弹簧被包括包层次结构 在你servlet.xml的扫描您的类注释(它会扫描低于基准值一切你插入。

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

Spring中的所有东西都是一个单例,发生了什么事情是Spring将这些值加载到它的Singleton中,然后我'新建了一个不包含新加载值的类的另一个实例,所以它始终为空。

改为在@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);   
} 

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

这个错误的另一个线索是,Tomcat抱怨超时试图从无法解析HTTPheader的Socket读取......这是因为Spring已经创建了服务的实例,所以我有,所以我的一个人在做真正的工作,而春天正在其实例中超时。