spring @vaule获取不到值

    1)当SpringMVC与Spring整合使用的时候,在Controller中无法获取@Value对应的值。(刚开始我就是这种情况,,,,)

         产生原因: 只在applicationContext中添加了扫描,没有在SpringMVC对应的配置文件中扫描。

         applicationContext加载的是父容器,,父容器在项目启动的时候就被加载了。SpringMVC对应的配置文件加载的是子容器,子容器可以访问父容器的对象,但是不能访问加载的配置文件。所以,如果想在SpringMVC中使用加载的配置文件,需要在SpringMVC对应的配置文件中添加相应的配置即可。

        2)在service或者dao层无法获取@Value的数值。

          可能情况:有多个applicationContext.xml文件,里面有多个context:property-placeholder,在web容器启动的时候同时加载了这些配置文件,这时候只会有一个配置文件中的context:property-placeholder会被加载,其他的不会被加载。

          那么,当需要加载多个properties的时候,如何解决?可以用下面的方法

<context:property-placeholder location="classpath:resource/*.properties"/>

         这样,将所有需要加载的properties放在一个目录之下,通过*.properties就可以加载所有的properties文件。

    @Value("${enable-upload-image}")
    private String enable;

如上所示,同样的代码,写在在业务层,运行时能取到正确的值,但在控制层却取得了@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在两个容器中都注册一下

spring mvc是spring的子容器,需要在两个配置文件中都导入配置文件
<context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true"/>

猜你喜欢

转载自blog.csdn.net/zipo/article/details/81351056