首页 > 解决方案 > 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 的根本原因是什么。任何帮助/提示将不胜感激。

标签: springspring-jdbcjdbctemplate

解决方案


问题应该是 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());
}

}


推荐阅读