Могу ли я использовать spring DataAccessException непосредственно на сервисном уровне

Могу ли я использовать Spring DataAccessException непосредственно на уровне обслуживания? Является ли это хорошей практикой / дизайном для распространения рабочего класса фрейма на уровне обслуживания?

ИЛИ

Должен ли я поймать DataAccessException на уровне dao и перебросить его как более общее исключение?


person rohit    schedule 20.05.2012    source источник


Ответы (3)


Я думаю, что уровень DAO может генерировать это исключение. Уровень обслуживания уже знает об уровне сохраняемости, поэтому дополнительные зависимости не создаются.

person duffymo    schedule 20.05.2012
comment
не повлияет ли это на разделение проблем между уровнем обслуживания и уровнем dao. Каков ваш подход к этому? - person rohit; 20.05.2012
comment
Разделения нет — это односторонние отношения по необходимости. Сервисный уровень знает о DAO, но не наоборот. Хорошо. - person duffymo; 20.05.2012
comment
Уровень обслуживания знает о DAO, но потенциально не знает о Spring. Это не приведет к новой зависимости библиотеки, но потенциально концептуальной. Возможно, это необычно на практике, но DAO можно было бы использовать несколькими способами ... Не уверен насчет этого; еще думаю. - person Dave Newton; 20.05.2012
comment
Сервисный уровень уже знает о Spring; в него был введен DAO. - person duffymo; 20.05.2012
comment
А как насчет сценария, если мне нужно снова вызвать DataAccessException на уровне пользовательского интерфейса... не создаст ли это высокую связь на всех уровнях? - person rohit; 20.05.2012
comment
Вы не должны бросать такие вещи в слой пользовательского интерфейса. Я сказал, что сервисный уровень имеет дело с DAO и его исключениями. Слой пользовательского интерфейса должен проходить через службу, чтобы получить то, что он хочет. - person duffymo; 20.05.2012
comment
Итак, как сообщить слою пользовательского интерфейса, если что-то случилось? - person rohit; 20.05.2012
comment
Сервисный уровень отправляет ответное сообщение контроллеру, который затем решает, что делать. - person duffymo; 20.05.2012

Хорошо сопоставить/обернуть DataAccessException (выброшенное из уровня DAO) в иерархию исключений для конкретного приложения (на уровне службы), чтобы зависимый/вызывающий уровень должен был просто иметь дело с классами исключений, специфичными для вашего приложения.

person Ahamed Mustafa M    schedule 20.05.2012
comment
Я не согласен с этим. Уровень службы может сопоставить его, но в слое сохраняемости нет значения, обертывающего собственное исключение. Сервисный уровень должен поймать его и обработать. Оборачивая его, вы только теряете информацию. - person duffymo; 20.05.2012
comment
Я имел в виду, что сервисный уровень должен обернуть его. Поскольку вопрос касается сервисного уровня, я не упомянул об этом явно. Кроме того, я не думаю, что обертывание потеряет трассировку исключения. - person Ahamed Mustafa M; 20.05.2012
comment
Нет, сервисный уровень не должен оборачивать его. Он должен справиться с этим, а не повторно бросать. Это совсем другое. - person duffymo; 20.05.2012
comment
Какую «обработку» вы ожидаете, если выдается подкласс DataAccessException, такой как DataAccessResourceFailureException/UncategorizedDataAccessException? - person Ahamed Mustafa M; 20.05.2012
comment
Итак, как сообщить слою пользовательского интерфейса, что произошло что-то плохое, как вы говорите, он должен справиться с этим, а не повторно. - person rohit; 20.05.2012
comment
Сервис должен отправлять информацию контроллеру для рендеринга, но это не должно быть исключением. Пользовательскому интерфейсу нужно указать отображать либо страницу ошибки с дружественным сообщением, либо что-то еще, но уж точно не исключение. - person duffymo; 20.05.2012
comment
Вы все предполагаете, что обертывание исключения каким-то образом полезно. Перед пользовательским интерфейсом здесь должен быть стопорный слой. - person duffymo; 20.05.2012

Лично я перехватываю все проверенные исключения на сервисном уровне и выбрасываю свои собственные исключения ServiceException, инициализируя их перехваченным исключением. Таким образом, информация об исключении не теряется, и контроллерам не нужно иметь дело с низкоуровневыми исключениями. Но нет необходимости делать это на уровне DAO.

В «Эффективной Java» (Дж. Блох) есть неплохая глава по обработке исключений, ее хорошо читать, как и остальную часть книги. Пункт 61 посвящен этому вопросу.

http://books.google.de/books/about/Effective_Java.html?id=Ft8t0S4VjmwC

person Community    schedule 21.05.2012