【发布时间】:2021-05-28 05:07:25
【问题描述】:
我正在尝试使用 JDBC 模板连接到数据库,并拥有一个包含以下内容的 application.config 文件:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/herosighting<br>
spring.datasource.username=root<br>
spring.datasource.password=<br>
我确实知道这个application.properties 正在被读取,因为我尝试更改server.port 并且它确实有效。
现在我有以下代码:
@Repository
public class LocationDaoImpl implements LocationDao
{
@Autowired
JdbcTemplate jdbc;
@Override
public Location addLocation(Location l) {
// TODO Auto-generated method stub
return null;
}
@Override
public void updateLocation(Location l) {
// TODO Auto-generated method stub
}
@Override
public List<Location> getAllLocations() {
// TODO Auto-generated method stub
return null;
}
@Override
public void deleteLocationById(int id) {
// TODO Auto-generated method stub
}
@Override
public List<Location> heroLocationsById(int heroId) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Location> sightingsOnDate(Date date) {
// TODO Auto-generated method stub
return null;
}
@Override
public Location getLocationById(int id)
{
final String SELECT_ROOM_BY_ID = "SELECT * FROM location WHERE id = ?";
return jdbc.queryForObject(SELECT_ROOM_BY_ID, new LocationMapper(), id);//returns room Object
}
}
最后一个方法的返回是null,因为JDBCTemplate为null。
我在 main 中调用了这个方法来测试它:
@Repository
public class Test {
@Autowired
static LocationDao dao;
public static void main(String[] args)
{
Location l = dao.getLocationById(1);
}
}
有趣的是,据我所知,我在另一个具有完全相同 pom.xml 的文件中有完全相同的配置,并且 jdbc 工作的项目
我的 pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.sg</groupId>
<artifactId>SuperheroSightings</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SuperheroSightings</name>
<description>Full stack Spring application for Superhero Sightings</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
编辑:由于我的问题令人困惑,我确实有一个主要的地方我 intalize spring 应用程序,这工作正常:
@SpringBootApplication
public class SuperheroSightingsApplication
{
public static void main(String[] args)
{
SpringApplication.run(SuperheroSightingsApplication.class, args);
}
}
我不想运行单元测试或任何东西。我要做的就是从我的 DAO 中运行一个方法来查看与数据库的连接是否正常。问题是 JDBCTemplate 为空,我不知道为什么。
这是确切的错误:
线程“main”中的异常 java.lang.NullPointerException:无法调用“com.sg.SuperheroSightings.Dao.LocationDao.getLocationById(int)”,因为“com.sg.SuperheroSightings.Test.dao”为空 在 com.sg.SuperheroSightings.Test.main(Test.java:18)
【问题讨论】:
-
您应该研究如何创建体面的测试。没有理由将 Test 标记为存储库,也没有理由在其中包含 main 方法。
-
1.您不能注入
static字段。 2.你在没有使用spring的情况下运行main,不会发生任何注入。 -
如果你想测试你的应用程序,你应该看看@SpringBootTest Annotation
-
“由于 JDBCTemplate 为空,最后一个方法的返回是空的”:不可能。它会抛出
NullPointerException。
标签: java spring jdbc jdbctemplate