首页 > 解决方案 > Springboot 组件返回属性值 null

问题描述

我实现了这个 springboot 组件,它应该在运行时返回一些属性的值

@Component
public class ConnectionService {
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    @Value("{spring.liquibase.change-log}")
    private String changelog;

    public ConnectionService() {

    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getChangelog() {
        return changelog;
    }

    public void setChangelog(String changelog) {
        this.changelog = changelog;
    }
}

但由于某种原因,所有属性都返回为 null

这就是我调用组件的方式

  @SpringBootApplication
public class MigrationsApplication {
    private static final Logger logger = LoggerFactory.getLogger(MigrationsApplication.class);
    @Autowired
    static
    ConnectionService cs;
    public static void main(String[] args) throws DatabaseException {
          try{
                    cs=new ConnectionService();
                    String dbUrl=cs.getUrl();
                    logger.info("URL:"+dbUrl);
                    String dbUsername=cs.getUsername();
                    logger.info("USERNAME:"+dbUsername);
                    String dbPassword=cs.getPassword();
                    logger.info("PASSWORD:"+dbPassword);
                    String changelogPath=cs.getChangelog();
    }

我究竟做错了什么?我需要一个完整的组件构造函数吗?因为 cs 是静态的吗?springboot 不是要自动填充值吗?

标签: javaspring-bootproperties

解决方案


Component意味着这是一个 bean,所以 Spring 将处理它的生命周期。创建 bean 时,它将用请求的数据填充它。但是,您尝试用它填充静态值,这不是生命周期的一部分。在类中添加一个完整的 arg 构造函数,让 Spring 将其注入到您要使用它的地方,它会正常工作。

编辑:

我刚刚意识到您没有使用静态变量,因此当您正确地让 Spring 初始化您的 bean 时,字段注入应该可以工作

编辑2:

根据您的代码段,您错误地使用了它。不要将业务逻辑放入主空白中,使用SpringApplication.run,另外,如果您想要 CLI,请使用 Spring 的 CommandLineRunner 接口,如下所示:


@SpringBootApplication
public class MigrationsApplication.class implements CommandLineRunner {

    private static final Logger logger = LoggerFactory.getLogger(MigrationsApplication.class);
    
    @Autowired
    ConnectionService cs;

    public static void main(String[] args) {
        SpringApplication.run(MigrationsApplication.class, args);
    }
 
    @Override
    public void run(String... args) {
        String dbUrl=cs.getUrl();
        logger.info("URL:"+dbUrl);
        String dbUsername=cs.getUsername();
        logger.info("USERNAME:"+dbUsername);
        String dbPassword=cs.getPassword();
        logger.info("PASSWORD:"+dbPassword);
        String changelogPath=cs.getChangelog();
    }
}



推荐阅读