spring - 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)
这是我做的一些事情:
- 我创建了一个
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);
}
}
主类如下所示
@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());
}
}
推荐阅读
- node.js - 如何在节点 js 中实现最快的 api 调用?
- ansible - 为什么加载 Ansible YAML 时出现语法错误?
- react-native - 无法调用 TfliteReactNative.loadModel
- jquery - IE 不断抛出错误,但我的 $ 已定义,甚至在 document.ready
- pyspark - 按环境分隔 Spark AWS Glue Metastore 条目(测试与产品)
- powershell - 感到困惑:我无法将参数传递给 PSObject 的方法
- c# - 从天气 api 解析 json
- sql-server - 使用非字母值作为列名的 SQL Server
- android - 属性 android:letterSpacing 在 BottomNavigationView 中不起作用
- swift - 在文件夹中查找最新修改的文件