jdbcTemplate is null and throws null pointer exception
Hi, maybe can someone explain why thist jdbc DAO method doesn't work and throws this exception?
Controller
@Controller
public class MainPageController {
private final VehicleDAO vehicleDAO;
private final UserDAO userDAO;
@Autowired
public MainPageController(VehicleDAO vehicleDAO, UserDAO userDAO) {
this.vehicleDAO = vehicleDAO;
this.userDAO = userDAO;
}
@GetMapping("/main")
public String index(UserDAO user, Model model) {
model.addAttribute("vehicles", vehicleDAO.index());
model.addAttribute("user", userDAO.currentUser());
return "main";
}
@GetMapping("/new-vehicle")
public String newCar(@ModelAttribute("vehicle") Vehicle vehicle) {
return "new-vehicle";
}
@PostMapping("/new-vehicle")
public String addCar(@ModelAttribute("vehicle") Vehicle vehicle,
VehicleDAO vehicleDAO) {
vehicleDAO.add(vehicle);
return "redirect:/main";
}
}
The problem is in the "add" method.
@Component
public class VehicleDAO {
private final JdbcTemplate jdbcTemplate;
@Autowired
public VehicleDAO(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<Vehicle> index() {
return jdbcTemplate.query("SELECT * FROM vehicles", new BeanPropertyRowMapper<>(Vehicle.class));
}
public void add(Vehicle vehicle) {
jdbcTemplate.update("INSERT INTO vehicles (car_brand, car_year, price_rent) VALUES(?, ?, ?)", vehicle.getCAR_BRAND(),
vehicle.getCAR_YEAR(), vehicle.getPRICE_RENT()); // here the problem
}
Vehicle object
public class Vehicle {
private int CAR_ID;
private String CAR_BRAND;
private int PRICE_RENT;
private int CAR_YEAR;
public Vehicle() {
}
public String getCAR_BRAND() {
return CAR_BRAND;
}
public void setCAR_BRAND(String CAR_BRAND) {
this.CAR_BRAND = CAR_BRAND;
}
public int getPRICE_RENT() {
return PRICE_RENT;
}
public void setPRICE_RENT(int PRICE_RENT) {
this.PRICE_RENT = PRICE_RENT;
}
public int getCAR_YEAR() {
return CAR_YEAR;
}
public void setCAR_YEAR(int CAR_YEAR) {
this.CAR_YEAR = CAR_YEAR;
}
public int getCAR_ID() {
return CAR_ID;
}
public void setCAR_ID(int CAR_ID) {
this.CAR_ID = CAR_ID;
}
public Vehicle(String CAR_BRAND, int PRICE_RENT, int CAR_YEAR, int CAR_ID) {
this.CAR_BRAND = CAR_BRAND;
this.PRICE_RENT = PRICE_RENT;
this.CAR_YEAR = CAR_YEAR;
this.CAR_ID = CAR_ID;
}
}
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>3.0.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>pl.messages</groupId>
<artifactId>web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>web</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</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>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Properties
spring.datasource.url=jdbc:postgresql://localhost:5432/CoolStoreDB
spring.datasource.username=user
spring.datasource.password=user
Console
2023-05-14T18:51:03.496+02:00 INFO 9688 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2023-05-14T18:51:03.549+02:00 INFO 9688 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-05-14T18:51:03.563+02:00 INFO 9688 --- [ restartedMain] pl.messages.web.WebApplication : Started WebApplication in 4.326 seconds (process running for 5.201)
2023-05-14T18:51:18.616+02:00 INFO 9688 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-05-14T18:51:18.616+02:00 INFO 9688 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2023-05-14T18:51:18.618+02:00 INFO 9688 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms
2023-05-14T18:51:18.707+02:00 ERROR 9688 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.NullPointerException: Cannot invoke "org.springframework.jdbc.core.JdbcTemplate.update(String, Object[])" because "this.jdbcTemplate" is null] with root cause
java.lang.NullPointerException: Cannot invoke "org.springframework.jdbc.core.JdbcTemplate.update(String, Object[])" because "this.jdbcTemplate" is null
at pl.messages.web.dao.VehicleDAO.add(VehicleDAO.java:22) ~[classes/:na]
at pl.messages.web.controller.MainPageController.addCar(MainPageController.java:41) ~[classes/:na]
I have tried change my sql command and debugged everything. Values came to the method but however throws me null of jdbcTemplayte for some reason.