@value读取不到数据库配置文件里的值的解决办法

时间:2025-02-13 07:20:35

用@value注解的时候遇到过两次问题,下面说一下两次的解决思路
spring框架可以直接读取,前提是properties文件里有这些值

    jdbc_driver=com.mysql.jdbc.Driver
    jdbc_url=jdbc:mysql://localhost:3306/xxx
    jdbc_username=root
    jdbc_password=root
  import ;

    @Service(value = "sqlService")
    public class SqlServiceImpl implements SqlService {

        @Value("${jdbc_driver}")
        private String jdbcDriver;
        @Value("${jdbc_url}")
        private String jdbcUrl;
        @Value("${jdbc_username}")
        private String jdbcUsername;
        @Value("${jdbc_password}")
        private String jdbcPassword;

        @Override
        public void fun(){}
    }

第一次:是核心包没有引

<dependency>
   <groupId></groupId>
   <artifactId>spring-context</artifactId>
   <version>${}</version>
</dependency>
<dependency>
   <groupId></groupId>
   <artifactId>spring-context-support</artifactId>
   <version>${}</version>
</dependency>
<dependency>
   <groupId></groupId>
   <artifactId>spring-aop</artifactId>
   <version>${}</version>
</dependency>
<dependency>
   <groupId></groupId>
   <artifactId>spring-web</artifactId>
   <version>${}</version>
</dependency>
<dependency>
   <groupId></groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>${}</version>
</dependency>
<dependency>
   <groupId></groupId>
   <artifactId>spring-jdbc</artifactId>
   <version>${}</version>
</dependency>
<dependency>
      <groupId></groupId>
      <artifactId>spring-test</artifactId>
      <version>${}</version>
      <scope>test</scope>
  </dependency>

第二次:后来在另外一个工程里取不到值了,试了很多次,发现是在中的如下代码中有错误,代码如下

    <!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 -->
    <context:component-scan base-package="" />

正确代码如下,扫描controller包下的所有类时,controller包的地址没有写完整。

<!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 -->
<context:component-scan base-package="" />

【出错原因】是【无法识别占位符,就是在加载过程中直接把${jdbc_driver}当做字符串处理了】

整理一下错误流程:

我的工程里有一个和,前者先执行,有如下代码:

  <bean id="decryptedPropertyPlaceholderConfigurer"
       class="">
       <property name="order" value="1"/>
       <property name="ignoreUnresolvablePlaceholders" value="true" />
       <property name="locations">
          <list>
             <value>classpath:*.properties</value>
             <value>classpath*:</value>
             <value>classpath*:</value>
          </list>
       </property>
    </bean>

    <!-- 自动扫描 -->
    <context:component-scan base-package="">
       <context:exclude-filter type="annotation"
          expression="" />
       <context:exclude-filter type="annotation"
          expression="" />
    </context:component-scan>

里面配置了数据库配置文件,并且自动扫描工程包下的所有文件,包括controller层和service层(带value注解的方法是写在service层里),在这时候是能正确的解析@value注解并且取到properties的值的;后来执行,由于扫描的路径填错成 base-package=”” ,它又把service层的@value注解扫描了,由于这个文件没有配置数据库配置文件,导致取不到值,把@value注解中的占位符当作字符串处理。