再现SQL异常和层体系结构中的正确处理

问题描述 投票:0回答:1

让我说这个:

        String sql = "DELETE FROM "+ TABLE_NAME +"  WHERE id=?";


        try {

            int ra = jdbcTemplate.update(connection -> {
                PreparedStatement stmt = connection.prepareStatement(sql);
                stmt.setLong(1, id);
                stmt.executeUpdate();
                return stmt;
            });

            if (ra == 0)
                throw new SQLException(SQL_ERROR);

        } catch (SQLException e){
            LOGGER.error(SQL_ERROR);
            throw new DataAccessLayerException("Entity could not be deleted due to SQL Exception");
        }

我正在使用键(id)从表中删除实体。现在,我希望能够在不引起INTERNAL_SERVER_ERROR的情况下向客户端报告RuntimeException

但是,我无法复制SQLException。例如,如果我在sql语句中删除一个字母,我只会得到一个语法错误,该错误被抛出为运行时错误,似乎我没有抓住它。

帮助我了解SQLException在这里的确切含义,以及如何在不引起RuntimeException的情况下将其再现并报告给客户端?

java sql spring-boot jdbc jdbctemplate
1个回答
0
投票

您的代码是错误的。您正在调用update(PreparedStatementCreator psc),顾名思义,您的代码应创建一个完全“已准备好”的语句对象,但不应“执行”该语句,因此请删除update(PreparedStatementCreator psc)调用。

executeUpdate()调用抛出一个executeUpdate(),而不是update(),因此,在DataAccessException块中,SQLException的唯一来源就是您的SQLException语句,因此您也可以抛出该try ]直接例外。不过,我建议您抛出if

由于Spring专门将已检查的DataAccessLayerException转换为未检查的EmptyResultDataAccessException运行时异常,所以在使用Spring JDBC时,您将始终获得运行时异常,这是good],因为您现在无需添加检查代码中所有方法的异常。

未处理的异常由Spring MVC处理。默认情况下,Spring MVC将重定向到错误页面。如果您不想这样做,请参见问题SQLException

© www.soinside.com 2019 - 2024. All rights reserved.