0

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.

Gimby
  • 5,095
  • 2
  • 35
  • 47

1 Answers1

-1

in your code, you have used the setter method, and it's used for setting extra properties to objects or customizing objects with specific logic.

If you don't want any extra customization then, use @Autowired annotation to initiate the property with declatrion. for e.g.

@Autowired
private JdbcTemplate jdbcTemplate;
Navnath Adsul
  • 364
  • 3
  • 10