在数字化转型中,选择合适的跨平台开发框架不仅能提高效率,还有助于确保数据安全与合规性。
1299
2022-11-22
Spring注解@Value在controller无法获取到值的解决
目录一、前言二、properties加入到Spring容器中有两种方式1、以注入bean的形式2、以下面这种形式三、将properties注册到Spring容器1、weixin.properties内容以键值对(key = value)形式存放2、@Value使用5、存在问题四、总结
一、前言
说到@Value注解,用过的应该都知道,这是Spring3的一个注解,通过@value注解的方式获取properties文件中的属性值,大大简化了我们读取配置文件的代码
想要通过@Value注解读取配置文件属性的值,那么首先必须要配置properties文件的加载,让Spring将properties的文件中的内容加载进Spring容器中进行管理,从而可以实现通过@Value注解读取配置文件属性的值。
二、properties加入到Spring容器中有两种方式
1、以注入bean的形式
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
2、以下面这种形式
加载多个properties文件使用,隔开
location="classpath:jeesite.properties,classpath:weixin.properties" /> 三、将properties注册到Spring容器 1、weixin.properties内容以键值对(key = value)形式存放 2、@Value使用 以 @Value("${key}")的形式获取properties中key对应的value值 , 以下为获取value值得代码截图 5、存在问题 问题 :但是上述步骤还存在一个问题,就是我在Service中通过 @Value("${token}") 可以获取到token的值,但是在controller中无法获取到token的值,若要在Controller层也使用@Value访问properties配置的话,需要在xxx-servlet.xml(我这里是Spring-mvc.xml)中也定义properties配置文件。 解决 : 必须在Spring-mvc.xml中加入 location="classpath:jeesite.properties,classpath:weixin.properties" /> 四、总结 如上所示,同样的代码,写在在业务层,运行时能取到正确的值,但在控制层却取得了@Value注解中的Key(@Value注解有个特点,如果取不到值,那么不是返回一个null,而是返回Key)。 原因是controller注册在dispatcherservlet-servlet.xml代表的Spring MVC的容器中,而service则注册在application-context.xml代表的Spring的容器中。 如果context:property-placeholder只注册在Spring的容器中,那么自然只有业务层的类可以取到enable-upload-image的值,而控制器取不到值。 解决方法就是把各种context:property-placeholder在两个容器中都注册一下。如: 并且现在可以从属性文件读取,这只是@Value其中一小部分用法,详细请查阅资料,这次记录只是记录我在项目中所遇到的问题,方便记忆,以防止自己以后再入坑,有纰漏请指出,不喜勿喷!
location="classpath:jeesite.properties,classpath:weixin.properties" />
三、将properties注册到Spring容器
1、weixin.properties内容以键值对(key = value)形式存放
2、@Value使用
以 @Value("${key}")的形式获取properties中key对应的value值 , 以下为获取value值得代码截图
5、存在问题
问题 :但是上述步骤还存在一个问题,就是我在Service中通过 @Value("${token}") 可以获取到token的值,但是在controller中无法获取到token的值,若要在Controller层也使用@Value访问properties配置的话,需要在xxx-servlet.xml(我这里是Spring-mvc.xml)中也定义properties配置文件。
解决 : 必须在Spring-mvc.xml中加入
location="classpath:jeesite.properties,classpath:weixin.properties" /> 四、总结 如上所示,同样的代码,写在在业务层,运行时能取到正确的值,但在控制层却取得了@Value注解中的Key(@Value注解有个特点,如果取不到值,那么不是返回一个null,而是返回Key)。 原因是controller注册在dispatcherservlet-servlet.xml代表的Spring MVC的容器中,而service则注册在application-context.xml代表的Spring的容器中。 如果context:property-placeholder只注册在Spring的容器中,那么自然只有业务层的类可以取到enable-upload-image的值,而控制器取不到值。 解决方法就是把各种context:property-placeholder在两个容器中都注册一下。如: 并且现在可以从属性文件读取,这只是@Value其中一小部分用法,详细请查阅资料,这次记录只是记录我在项目中所遇到的问题,方便记忆,以防止自己以后再入坑,有纰漏请指出,不喜勿喷!
location="classpath:jeesite.properties,classpath:weixin.properties" />
四、总结
如上所示,同样的代码,写在在业务层,运行时能取到正确的值,但在控制层却取得了@Value注解中的Key(@Value注解有个特点,如果取不到值,那么不是返回一个null,而是返回Key)。
原因是controller注册在dispatcherservlet-servlet.xml代表的Spring MVC的容器中,而service则注册在application-context.xml代表的Spring的容器中。
如果context:property-placeholder只注册在Spring的容器中,那么自然只有业务层的类可以取到enable-upload-image的值,而控制器取不到值。 解决方法就是把各种context:property-placeholder在两个容器中都注册一下。如:
并且现在可以从属性文件读取,这只是@Value其中一小部分用法,详细请查阅资料,这次记录只是记录我在项目中所遇到的问题,方便记忆,以防止自己以后再入坑,有纰漏请指出,不喜勿喷!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~