为啥@Value 属性为空?

Posted

技术标签:

【中文标题】为啥@Value 属性为空?【英文标题】:Why is @Value Attribute null?为什么@Value 属性为空? 【发布时间】:2021-08-03 18:59:25 【问题描述】:

我目前正在尝试从我的 application.properties 文件中连接一个数据库,以在不同的类中获得 JDBC 连接。我使用了以下方法。

@Component
public class databaseConn 
    public static int counter=0;
    @Value("$spring.datasource.url")
    private String url;
    @Value("$spring.datasource.username")
    private String username;
    @Value("$spring.datasource.password")
    private String password;

    //Retrieves Everything from the database and sends it to the front end
    public ArrayList<Alert> datacon() throws ClassNotFoundException, SQLException 
        ArrayList<Alert> giveBack = new ArrayList<Alert>();
        Statement stmt = null;
        Connection conn=null;
        System.out.println(url);
        System.out.println(username);
        System.out.println(password);
        try 
            conn = DriverManager.getConnection(url, username, password);
        
        catch (Exception e)
            System.out.println("Couldn't Connect");
        

由于某种原因,当我打印这些值时,它们显示为 Null 并且无法连接。我做错了什么?

编辑:这是 application.properties 文件。我修改了每个字段的值,但可以看到其他所有内容

spring.application.name=sampleApp
spring.datasource.url=xxxx
spring.datasource.username=username
spring.datasource.password=password
spring.http.encoding.enabled=false
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect

【问题讨论】:

你能显示 application.properties 文件吗? @ErkanErkişi 刚刚添加 这些可能为空的原因有很多。另外,请记住,如果您使用的是 spring.datasource,则可以直接 Autowire 数据源。 是的,我同意@lane.maxwell。我认为您的课程在我看来没有被视为一个组件。 【参考方案1】:

什么时候调用 datacon()?如果您是从构造函数执行此操作,则尚未设置这些值(属性是在构造类之后注入的,除非您使用构造函数注入将它们添加到构造函数)。如果您想验证它们是否被设置,通过查看代码和它们应该是的属性,添加 PostContruct 方法。

import javax.annotation.PostConstruct;

...

@PostConstruct
public void verifyMyPrope() 
  System.out.println(username);

附带说明,除非这是测试代码,否则请避免使用 System.out,这很淘气 :)

【讨论】:

以上是关于为啥@Value 属性为空?的主要内容,如果未能解决你的问题,请参考以下文章

iOS UI测试中元素lastSnapshot的子属性总是为空,为啥?

为啥Required IdentityUser 属性会导致可以为空的数据库字段?

MVVM WPF:为啥在运行应用程序时更新文本框中的文本后模型中的属性始终为空?

Building Calculator,无法设置为空的属性'value'

为啥反射不在 Struct 中设置属性?

java 如何实现判断一个对象所有的属性是不是为空