Spring注解@Value在Controller中无法获取到值

参考博客:https://blog.csdn.net/Thinkingcao/article/details/80620240

问题引入

在项目中需要引入一个properties配置文件,这里的是upload.properties,配置了一个物理硬盘目录。

然后在spring的applicationContext.xml配置文件中加载引入properties文件

然后在一个控制器Controller类中使用

可以看到并没有得到@Value中注入的值

那么问题就来了,为什么在Controller层中无法得到@Value("${basePath}")的值呢?

但是,在Service层中却可以访问该@Value("${basePath}")的值,如下,创建一个Service层,使用@Service注解,然后在该实现类中使用@Value("${basePath}”)注入basePath值,通过一个getPath()方法将值传递出去:

接着在controller层中注入service,调用该方法。

确实可以访问在service层

原因

因为controller注册在spring-mvc.xml代表的spring mvc容器中,而service注册在applicationContext.xml代表的spring的容器中。

如果<context:property-placeholder>引入properties配置文件只注册在spring的容器中,那么只有业务层的类可以访问到@Value("${basePath}”)的值,而控制器Controller层无法访问到值。

因此解决方法就是在spring-mvc.xml和applicationContext.xml文件中都注册<context:property-placeholder>。

下面来做一个有趣的小实验:

①只在spring-mvc.xml中引入<context:property-placeholder>

发现Controller控制层确实可以访问到@Value("${basePath}")的值,但是发现service层无法得到@Value("${basePath}")的值了

②只在applicationContext.xml中引入<context:property-placeholder>

发现service层可以访问到@Value("${basePath}")的值(注意:下面的代码虽然有Controller类的涉入,但实际上只是用来表示service层获取到值的一个媒介,实际上值来自于service层,与controller层无关

但在controller层却无法得到值。

③既在applicationContext.xml中引入<context:property-placeholder>,又在spring-mvc.xml中引入<context:property-placeholder>

在controller层能访问

在service层也能访问

解决

按如上所说,解决方法有上面这么三种:

第一种:既在applicationContext.xml中引入<context:property-placeholder>,又在spring-mvc.xml中引入<context:property-placeholder>,那么controller层和service层都可以访问到@Value中的值。

第二种:只需要在controller层访问,那么在控制层注入@Value即可。

第三种:在service层注入@Value,但是创建一个接口,里面设置一个方法返回@Value中的值,实现接口中的方法返回值,然后在controller层注入service接口,通过接口的方法也能间接得到@Value的值。

猜你喜欢

转载自blog.csdn.net/cnds123321/article/details/113061545