原因: @Value("${属性名}") 注解是通过对象的set 方法赋值的,构造方法的执行在set方法之前,所以在构造方法中使用变量会发现变量为 null。

方法1:
将@Value("${spring.profiles.active}")放入构造方法的参数中,适用于单个@Value属性注入

public K8sManager(@Value("${spring.profiles.active}")String profile) {
        String kubeConfigPath = profile +"-"+"config";
        File configFile = new File(kubeConfigPath);
        ...
    }

若为多个@Value都需要注入到构造参数中,可参考方法2,3
方法2:这个方法应该是有点其他的问题
(1)将需要注入的参数放到对应环境的application.yml文件中,比如
application-test.yml
(可以在启动器中加入-Dspring.profiles.active=test指定使用某个环境的application-xxx.yml)

docker-properties:
  docker-host: tcp://xxx.xx.xxx.xx:2375
  registry-url: https://xxxxxx/
  registry-username: xxxxx
  registry-password: xxxxx

(2)创建config类

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "docker-properties")
public class DockerProperties {


    private String dockerhost;

    private String registryurl;

    private String registryUsername;

    private String registrypassword;

}

(3)修改业务类

@EnableConfigurationProperties(DockerProperties.class) 声明要使用DockerProperties这个类的对象
@Bean方法的参数注入

@Service
@EnableConfigurationProperties(DockerProperties.class)
public class LocalDockerManager {

    private static final Logger log = LoggerFactory.getLogger(DockerManager.class);

    private DockerClient dockerClient;

    DockerProperties dockerProperties;

    public LocalDockerManager(DockerProperties dockerProperties) {
        this.init(dockerProperties);
    }

    /**
     * 初始化dockerClient
     */
    @Bean
    public DockerManager init(DockerProperties dockerProperties) {
        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
                .withDockerHost(dockerProperties.getDockerhost())
                .withRegistryUrl(dockerProperties.getRegistryurl())
                .withRegistryUsername(dockerProperties.getRegistryUsername())
                .withRegistryPassword(dockerProperties.getRegistrypassword())
                .build();
        this.dockerClient = DockerClientBuilder.getInstance(config).build();
        return this;
    }

适用于有参构造需要传递配置中的参数到业务方法中赋值
在这里插入图片描述
方法3:
(1)(2)同法2
(3)修改业务类
@EnableConfigurationProperties(DockerProperties.class) 声明要使用DockerProperties这个类的对象
不需要@Bean参数注入

@Service
@EnableConfigurationProperties(DockerProperties.class)
public class LocalDockerManager implements DockerManager {

    private static final Logger log = LoggerFactory.getLogger(DockerManager.class);

    private DockerClient dockerClient;

    public LocalDockerManager(DockerProperties dockerProperties) {
        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
                .withDockerHost(dockerProperties.getDockerhost())
                .withRegistryUrl(dockerProperties.getRegistryurl())
                .withRegistryUsername(dockerProperties.getRegistryUsername())
                .withRegistryPassword(dockerProperties.getRegistrypassword())
                .build();
        this.dockerClient= DockerClientBuilder.getInstance(config).build();
    }

在这里插入图片描述

参考链接:
SpringBoot-SpringBoot的属性注入
在构造函数里使用@Value注入的属性值获取不到
springboot的yml注入值的方式以及value等注解的使用
@Value("${属性名}")注解在对象的构造方法中的使用

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐