Воспроизведение SQL Исключение и правильная обработка в архитектуре слоя - PullRequest
0 голосов
/ 23 марта 2020

Допустим, у меня есть это:

        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?

1 Ответ

2 голосов
/ 23 марта 2020

Ваш код неверный. Вы звоните update(PreparedStatementCreator psc), и, как следует из названия, ваш код должен создать полностью «подготовленный» объект оператора, но он не должен «выполнять» этот оператор, поэтому удалите executeUpdate() call.

Вызов update() выдает DataAccessException, а не SQLException, поэтому единственным источником SQLException внутри этого блока try является ваш оператор if, так что вы можете просто выбросить это исключение DataAccessLayerException напрямую. Я бы рекомендовал вместо этого бросить EmptyResultDataAccessException.

Поскольку Spring специально преобразует отмеченный SQLException в непроверенное исключение DataAccessException времени выполнения, вы всегда получите исключения времени выполнения при использовании Spring JDB C, и это хорошая вещь , потому что теперь вам не нужно добавлять проверенные исключения ко всем методам в вашем коде.

Необработанное исключение обрабатывается Spring MVC. По умолчанию Spring MVC будет перенаправлять на страницу с ошибкой. Если вы не хотите этого, см., Например, вопрос Spring Boot Remove Whitelabel Error Page .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...