Недавно использовав mybatis-spring для проекта, я наткнулся на тот же камень преткновения. Я также не хотел засорять свой класс обслуживания обработкой исключений DAO, особенно потому, что некоторым методам в моем уровне обслуживания требовался доступ только для чтения к множеству различных таблиц.
Решение, к которому я пришел, заключалось в том, чтобы перехватывать исключения на уровне службы, но создавать собственный тип исключения, который принимает перехваченное исключение в качестве параметра. Затем можно отфильтровать, какое сообщение об ошибке должно содержаться при фактическом создании исключения, и устранить необходимость сопоставления строк (по крайней мере, на уровне службы).
Вы близки к этому, за исключением того, что AccountServiceException
будет иметь конструктор, который принимает Exception e
в качестве параметра. Я также решил попытаться сделать все свои данные доступными как можно раньше и обернуть все в одну попытку. Поскольку MapperFactoryBean
всегда переводит выданные исключения в Spring DataAccessExceptions
, вам не нужно беспокоиться о перехвате других видов исключений при доступе к данным.
Я не решаюсь считать это ответом как таковым - это скорее обмен опытом, учитывая, что я с этим сталкивался и колебался.