【问题标题】:DataAccessException can not cast to SQLException to get error code and sql stateDataAccessException 无法转换为 SQLException 以获取错误代码和 sql 状态
【发布时间】:2023-04-10 03:38:01
【问题描述】:

下面的 sn-p 代码来自 Spring 5 食谱书(第 386 页)。我正在尝试运行和测试代码,但得到 NullPointerExceptionsqle 变量,而且在 Spring 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());
        }
    }
}

【问题讨论】:

  • 看来 e.getCause() 不是 SqlException 类型。您可以在执行强制转换操作之前打印所有堆栈跟踪或使用您的 IDE 对其进行调试。
  • 你的vehicleDaonull是吗?

标签: java spring sqlexception


【解决方案1】:

首先,您永远不会检查 e.getCause() 是否返回 null。 如果它返回 null 你的代码很容易受到 NullPointerException 的影响

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

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

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

一方面,JDBC 的异常层次结构过于通用——并不多 完全是一个层次结构。另一方面,Hibernate 的例外 层次结构是 Hibernate 专有的。我们需要的是一个层次结构 描述性但不直接的数据访问异常 与特定的持久性框架相关联。

我强烈推荐整个子章节来理解这个主题。

【讨论】:

  • 没问题。如果您认为我的回答有帮助,请务必点赞 IT 并将其标记为答案
猜你喜欢
  • 1970-01-01
  • 2015-03-08
  • 2013-05-30
  • 2019-08-22
  • 1970-01-01
  • 2012-05-18
  • 2017-10-25
  • 2018-06-27
  • 2013-02-13
相关资源
最近更新 更多