Spring jdbcTemplate NPE 异常

问题描述

我正在尝试使用 jdbcTemplate 查询 MysqL 数据库获取 SYSDATE。所以查询就像SELECT SYSDATE()

一样简单

但是,我收到以下错误

Exception in thread "main" java.lang.NullPointerException
at com.Trade.xml.modifier.Test.<init>(Test.java:18)
at com.Trade.xml.modifier.TradeModifierApplication.main(TradeModifierApplication.java:17)

这是我做的一些事情:

  1. 我创建了一个 DatabaseConfiguration.class,它应该从 application.properties 获取所有连接详细信息

application.properties 看起来像这样:

spring.datasource.url=jdbc:MysqL://localhost:3306/xmlconverter
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.MysqL.cj.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect

DatabaseConfiguration.class 看起来像这样

@Configuration
public class DatabaseConfiguration {

        @Value("${spring.datasource.driver-class-name}")
        private String driverName;

        @Value("${spring.datasource.url}")
        private String url;

        @Value("${spring.datasource.username}")
        private String userName;

        @Value("${spring.datasource.password}")
        private String password;

        @Bean(name = "dataSource")
        public DataSource dataSource() {
            final DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName(driverName);
            dataSource.setUrl(url);
            dataSource.setUsername(userName);
            dataSource.setPassword(password);
            return dataSource;
        }
    
    @Bean
    public JdbcTemplate dbjdbcTemplate() {
        return new JdbcTemplate(dataSource());
    }

}

2.我还创建了一个 Test.class,我在其中编写了查询方法

@Service
public class Test {
    
    //Since a bean is created in DatabaseConfiguration,//"template = new JdbcTemplate()" is omitted (should be recognized automatically,right?)
    @Autowired
    private JdbcTemplate template;
    
    
    public String getDate() {
        String sql = "SELECT SYSDATE()";
        
        return template.queryForObject(sql,String.class);
    }

}
  1. 主类如下

     @SpringBootApplication
     public class TradeModifierApplication {
    
     public static void main(String[] args) {
         SpringApplication.run(TradeModifierApplication.class,args);
    
         Test test = new test();
         System.out.println(test.getDate());
    

此时我已经阅读了整个互联网,但我不确定这个 NPE 的根本原因是什么。任何帮助/提示将不胜感激。

解决方法

问题应该是 TradeModifierApplication 中的这一行:

Test test = new Test();

你应该让spring容器实例化Test类。

一种方法是通过以下方式注入:

public static void main(String[] args) {
    ApplicationContext applicationContext = SpringApplication.run(TradeModifierApplication.class,args);
    Test service = applicationContext.getBean(Test.class);
    service.getDate());
}

}