DataAccessException无法转换为SQLException以获取错误代码和sql状态

时间:2018-10-14 12:20:21

标签: java spring sqlexception

下面的代码段摘自Spring 5 Recipes一书(第386页)。我正在尝试运行和测试代码,但为NullPointerException变量获取了sqle,而且似乎在春季5中SQLExceptionDataAccessException之间没有任何关系。有人可以告诉我吗为什么和如何?

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 :(得分:1)

首先,您永远不会检查e.getCause()是否返回null。 如果返回null,则您的代码容易受到NullPointerException的攻击

第二点是,为什么Spring改变其处理数据库/ jpa异常的方式。 已经有一些关于此的对话。例如LINK

或者,您还可以阅读C. Walls撰写的书“ Spring in Action” ,在其中我们可以阅读有关JDBC的章节。

(10.1.1了解Spring的数据访问异常层次结构)

  

一方面,JDBC的异常层次结构太笼统了-不多   一个层次结构。另一方面,Hibernate的例外   层次结构是Hibernate专有的。我们需要的是一个层次结构   描述性但非直接的数据访问异常   与特定的持久性框架相关联。

我强烈建议您完整阅读本章以了解该主题。