目录

问题引出

问题解决

1.检测语法是否正确

2.检测配置文件中是否有进行配置

3.检测是否增加注解

4.检测代码中的书写方式

5.@Value无法注入static属性

最终解决


问题引出

最近开发的项目中遇到了@Value注解无法引入值的问题,让我们来详细分析一下是什么原因。

首先,贴代码

config文件

@Configuration
public class InfluxdbConfig {

    @Value("${spring.influx.url:''}")
    private String influxDBUrl;

    @Value("${spring.influx.user:''}")
    private String userName;
..................
}

yml文件

spring:
  influx:
    url: http://127.0.0.1:8086
    user: 123
    password: 123
    

@Value注入的值为‘’,只取到了默认值,没有获取到yml中的值,将默认值取消后@Value("${spring.influx.url}"),运行程序报错

Could not resolve placeholder 'spring.influx.url' in value "${spring.influx.url}"

很明显没有注入成功,接下来我们进行问题的解决

问题解决

经过查询,网络上大概有这五种解决方案。

1.检测语法是否正确

@Value("${spring.influx.url:''}")
private String influxDBUrl;

 

语法正确,没有问题

2.检测配置文件中是否有进行配置

.yml文件配置正确,没有异常

3.检测是否增加注解

在spring中,使用了spring的注解,那么就需要使用spring来进行管理对象,而不能自己进行new,否则就会导致失败。

使用了@Configuration注解,也没有问题。

4.检测代码中的书写方式

不要再无参构造器中,进行new对象的操作。否则就会造成@Value注解失败。

5.@Value无法注入static属性

使用@Value直接放在static的属性上是无法注入内容的!!!此方式会一直是null.

五种方案都尝试之后,发现问题还是没有解决

最终解决

结果无数次排查,始终没有找到原因,最后在pom.xml发现了问题

<artifactId>handler</artifactId>
<packaging>pom</packaging>
<name>handler</name>

就是这个<packaging>,竟然设置成了pom,此属性可设置三种参数,分别为:

<package> 属性表示项目的打包类型【默认:jar类型】
  • pom

        <packaging>pom</packaging>    【父类型及抽出的公共组件都为pom类型,没有application文件,不能单独启动运行】
  • jar

        <packaging>jar</packaging>       【内部调用或者是做服务使用】
  • war

  •     <packaging>war</packaging>     【需要部署的项目】
    将此配置删除之后,@Value就能正确取值了。
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐