Как я могу не создавать исключение в сигнатуре метода интерфейса, если я создаю исключение в методе, реализующем этот интерфейс?

#java #exception #design-patterns #dao

Вопрос:

У меня есть интерфейсы Dao для каждой сущности.Также я реализую эти интерфейсы для каждого ресурса, например, MYSQL.Методы MYSQL Dao создают определенные исключения , поэтому мне нужно выбросить их на интерфейсном уровне, но исключения специфичны для MYSQL, так как я могу не выбросить их на интерфейсном уровне?Или мне нужно изменить дизайн? Например, у меня есть интерфейс UserDao :

 public interface UserDao {
    boolean insertUser(Connection connection, User user) throws MySQLEXContainer.MySQLDBNotUniqueException, MySQLEXContainer.MySQLDBLargeDataException, MySQLEXContainer.MySQLDBExecutionException, SQLException;
    boolean deleteUser(Connection connection,String login) throws MySQLEXContainer.MySQLDBExecutionException, SQLException;
    boolean validateUser(Connection connection,String login,String password) throws MySQLEXContainer.MySQLDBExecutionException, SQLException;
    User findUser(Connection connection,String login) throws MySQLEXContainer.MySQLDBExecutionException, SQLException;
    boolean updateUser(Connection connection,String login,String newPassword) throws MySQLEXContainer.MySQLDBExecutionException, SQLException;
    List<User> findAllUser(Connection connection) throws MySQLEXContainer.MySQLDBExecutionException, SQLException;
}
 

Я реализовал все из них, но показываю только один

Реализация класса MYSQLUserDao метода insertUser

 @Override
    public boolean insertUser(Connection connection, User user) throws MySQLEXContainer.MySQLDBNotUniqueException, MySQLEXContainer.MySQLDBLargeDataException, MySQLEXContainer.MySQLDBExecutionException, SQLException {
        LOGGER.debug("Insert User Is started");
        int rowNum;
        ResultSet keys = null;
        Connection con;
        PreparedStatement statement = null;
        try {
            String query = QueriesUtil.getQuery("insertUser");
            con = connection;
            statement = con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
            statement.setString(1, user.getLogin());
            statement.setString(2, PasswordUtil.generateStrongPasswordHash(user.getPassword()));
            statement.setString(3, user.getUserType());
            statement.setString(4, user.getUserEmail());
            rowNum = statement.executeUpdate();
            keys = statement.getGeneratedKeys();
            if (keys.next()) {
                user.setUserId(keys.getInt(1));
            }
        } catch (SQLException e) {
            LOGGER.error(e);
            if (e.getErrorCode() == 1062) {
                throw new MySQLEXContainer.MySQLDBNotUniqueException(String.format("%s %s", user.getLogin(), user.getUserEmail()), e.getCause());
            } else if (e.getErrorCode() == 1406) {
                throw new MySQLEXContainer.MySQLDBLargeDataException("Data Is too long", e);
            }
            throw new MySQLEXContainer.MySQLDBExecutionException("Bad execution", e);
        } finally {
            ConnectionUtil.oneMethodToCloseThemAll(keys, statement, null);
            LOGGER.debug("Close all resources");
        }
        return rowNum > 0;
    }
 

Если я хочу реализовать dao для Oracle, мне нужно будет создать определенное исключение для OracleDB, и поэтому в сигнатуре методов интерфейса будет слишком много исключений. Как я могу решить эту проблему?

Комментарии:

1. Неверный. Все эти исключения Oracler должны иметь общее исключение базового класса. Просто объявите свой метод, чтобы бросить это.

Ответ №1:

Я могу придумать по крайней мере два способа добиться этого:

  • Не переосмысливайте исключения MySQL*в реализации. Просто зарегистрируйте их.
  • Поймайте их и инкапсулируйте в виде собственного пользовательского исключения

Прочитайте это, чтобы узнать некоторые известные рекомендации по обработке исключений: https://dzone.com/articles/9-best-practices-to-handle-exceptions-in-java

Ответ №2:

Я считаю, что ваш метод такой старый. Почти все разработчики используют какой-либо ORM, такой как Hibernate, MyBatis и т. Д…

Поэтому, на мой взгляд, вы должны использовать ORM. Это экономит много времени. Например, если вы используете проект Maven, просто добавьте зависимость hibernate в свой pom.xml

или

Вы должны написать собственный класс исключений и использовать свой собственный класс.