DataAccessException не может привести к SQLException, чтобы получить код ошибки и состояние SQL - PullRequest
0 голосов
/ 14 октября 2018

приведенный ниже фрагмент кода взят из книги рецептов Spring 5 (стр. 386).Я пытаюсь запустить и протестировать код, но получить NullPointerException для sqle переменной, и, кроме того, кажется, что нет никакой связи между SQLException и DataAccessException в Spring 5. Может кто-нибудь сказать мне, почему и как?

package com.apress.springrecipes.vehicle;
...
import java.sql.SQLException;
import org.springframework.dao.DataAccessException;

public class Main {

    public static void main(String[] args) {
        ...
        VehicleDao vehicleDao = context.getBean(VehicleDao.class);
        Vehicle vehicle = new Vehicle("EX0001", "Green", 4, 4);
        try {
            vehicleDao.insert(vehicle);
        } catch (DataAccessException e) {
            SQLException sqle = (SQLException) e.getCause();
            System.out.println("Error code: " + sqle.getErrorCode());
            System.out.println("SQL state: " + sqle.getSQLState());
        }
    }
}

1 Ответ

0 голосов
/ 14 октября 2018

Прежде всего, вы никогда не проверяете, возвращает ли e.getCause () значение null или нет.Если он возвращает null, ваш код уязвим для NullPointerException

Второй момент: почему Spring меняет способ обработки исключений базы данных / jpa.Уже есть некоторые разговоры об этом.Например, LINK

Или, кроме того, вы можете обратиться к книге "Весна в действии" C. Walls , где в главе о JDBC мы можем прочитать.

(10.1.1 Знакомство с иерархией исключений для доступа к данным Spring)

С одной стороны, иерархия исключений в JDBC слишком общая - она ​​совсем не иерархическая.С другой стороны, иерархия исключений Hibernate является собственностью Hibernate.Нам нужна иерархия исключений доступа к данным, которые являются описательными, но не связаны напрямую с конкретной средой персистентности.

Я настоятельно рекомендую весь подраздел для понимания этой темы.

...