Как обрабатывать специфические исключения БД в контроллере пружин - PullRequest
3 голосов
/ 06 мая 2019

В моем контроллере я вызываю несколько методов базы данных.Ряды нужно хранить в oracle и postgres.Как я должен обрабатывать исключения в этом сценарии;дубликаты, уникальное исключение нарушения ограничения и т. д.

В коде я обрабатываю исключения, относящиеся как к oracle, так и к postgres.Этот код дублирует весь код.Как я могу справиться с этой ситуацией, используя общий код.

Что является хорошим способом обработки исключений в этом сценарии.

catch (Exception e) {
    if (e instanceof PSQLException || (e.getCause() != null && e.getCause().getMessage().contains("already exists"))) {
        String errMsg = e.getCause().getMessage();
        if (errMsg.contains("already exists")) {
            errMsg = errMsg.substring(errMsg.indexOf('"') + 1, errMsg.lastIndexOf('"'));
        }
        userResponse.setMessage("ExistedUser");
        userResponse.setValue(errMsg);
    } else if (e instanceof SQLIntegrityConstraintViolationException || e.getLocalizedMessage().contains("SQLIntegrityConstraintViolationException")) {
        userResponse.setMessage("Duplicate");
    }
}

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Взгляните на шаблон проектирования обратного вызова . По сути, вы работаете с экземпляром интерфейса в вашем коде, и его реализация обрабатывает ваши исключения / транзакции БД. Вы можете иметь что-то вроде:

public interface DatabaseQuery {
    public void execute();
}

public class OracleQuery implements DatabaseQuery {

@Override
public void execute() {
   //run query, catch exceptions etc.

}

}

public class PostgresQuery implements DatabaseQuery {

@Override
public void execute() {
   //run query, catch exceptions etc.

}

}

Затем в своем коде, где вам нужно выполнять транзакции базы данных, вы передаете экземпляр этого интерфейса:

public class TestQuery {
    DatabaseQuery query;

    public TestQuery(DatabaseQuery query) {
          this.query = query;
    }

    public void SomeDatabaseStuff() {
        //some code
        // need to work with the db
        query.execute();
        //some more code
    }
}

Вам не нужно беспокоиться о том, будет ли это Oracle или Postgres, реализация справится с этим за кулисами.

0 голосов
/ 06 мая 2019

В ваших методах контроллеров вы можете разрешить всплытию вашего исключения, если вы зарегистрировали обработчики исключений для их правильной обработки, это только один из немногих способов, которыми Spring предлагает вам обработать исключения, см. https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvcдля более полных примеров

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