Как правильно настроить класс контроллера JDBC с помощью Spring Boot? - PullRequest
0 голосов
/ 19 февраля 2019

Я очень новичок в Spring Boot (или даже в Spring).Я хочу создать класс Singleton, который управляет моей базой данных jdbc.После того, как (успешные тесты) я попытался разделить свой основной класс и этот класс DBHandler, я получаю исключение NullPointerException при попытке вызвать метод для объекта моей базы данных в моем классе DBHandler.
Возможно, мне нужна некоторая аннотация для моего класса DBHandler?Это правильный способ создания класса обработчика базы данных в Spring Boot?

Основной класс:

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application implements CommandLineRunner {

    public static void main(String args[]) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... strings) throws Exception {
        DBHandler db = DBHandler.getDBHandler();
        db.deleteTable();
        db.createTable();
    }
}

Класс JDBC Handler Singleton, который я хочу заполнить функциями для взаимодействия с моей базой данных, которыеЯ могу звонить из других классов.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

public class DBHandler {

    @Autowired
    JdbcTemplate database;

    private static DBHandler instance;

    private DBHandler() {
    }

    public static DBHandler getDBHandler() {
        if (instance == null) {
            synchronized (DBHandler.class) {
                if (instance == null) {
                    instance = new DBHandler();
                }
            }
        }
        return instance;
    }

    public void createTable() {
        database.execute("CREATE TABLE users(id SERIAL, accountName VARCHAR(255), validated VARCHAR(255), validationCode VARCHAR(255), updateDate DATETIME)");
    }

    public void deleteTable() {
        database.execute("DROP TABLE IF EXISTS users");
    }
}

Все работает нормально, когда у меня есть база данных Autowired и функции в основном (Application) классе.

1 Ответ

0 голосов
/ 19 февраля 2019

По умолчанию spring создает синглтон-бин, поэтому оставьте его для Spring контекста приложения. Annotate DBHandler с @Component

DBHandler

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

@Component
public class DBHandler {

@Autowired
JdbcTemplate database;

public void createTable() {
    database.execute("CREATE TABLE users(id SERIAL, accountName VARCHAR(255), validated VARCHAR(255), validationCode VARCHAR(255), updateDate DATETIME)");
}

public void deleteTable() {
    database.execute("DROP TABLE IF EXISTS users");
    }
}

Приложение

@SpringBootApplication
public class Application implements CommandLineRunner {

@Autowired
private DBHandler dBHandler;

public static void main(String args[]) {
    SpringApplication.run(Application.class, args);
}

@Override
public void run(String... strings) throws Exception {
    db.deleteTable();
    db.createTable();
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...