春季@Value注释总是计算为 null?

2022-08-31 20:09:00

因此,我有一个简单的属性文件,其中包含以下条目:

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


答案 1

如果 通过 手动实例化 的实例,则 Spring 不会参与其中,因此注释将被忽略。Confignew

如果你不能改变你的代码来让Spring实例化bean(也许使用-scoped bean),那么另一个选项是使用Spring的加载时间类加载器编织功能(参见文档)。这是一些低级AOP,它允许您像往常一样实例化对象,但是Spring会通过应用程序上下文传递它们,以使它们连接,配置,初始化等。prototype

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


答案 2

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

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

我花了一整天的时间尝试各种注释组合,但它总是返回 null。最后,答案一如既往地在事后显而易见。

1)确保Spring正在扫描你的类以查找注释,方法是在你的servlet中包含包层次结构.xml(它将扫描你插入的基值以下的所有内容。

2)确保你没有“新”你刚刚告诉Spring要看的课程。相反,您可以在@Controller类中使用@Autowire。

Spring中的所有内容都是单例,并且发生的事情是Spring将值加载到其Singleton中,然后我“new”了该类的另一个实例,该实例不包含新加载的值,因此它始终为空。

相反,在@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的套接字中读取...这是因为Spring创建了一个服务的实例,我也创建了一个实例,所以我的一个正在做真正的工作,而Spring正在超时。


推荐