Рассмотрим следующий случай:
У меня есть модуль "serivce", класс которого называется ClientService
.
This ClientService
использует класс с именем ClientDao
в модуле "dao".
ClientDao
имеет метод insert(@Valid Client c)
.Этот метод выдает DaoException
.
Клиент - моя сущность.Его атрибуты аннотированы валидациями Javax-бинов, например @javax.validation.constraints.NotNull
.
Если нарушено какое-либо ограничение, ClientService
получает ConstraintViolationException
.Но ClientService
ожидает только DaoException
или любое другое исключение модуля "dao".И я хочу, чтобы все было так, выкидывая исключения, относящиеся только к той задаче, которую выполняет объект, скрывая детали реализации для более высокого уровня (в данном случае, для модуля «service»).
Что бы я хотелкак это сделать, это инкапсулировать javax.validation.ConstraintViolationException
в ValidationException
моего "dao" модуля и объявить его в предложении trows
вместе с DaoException
.И я не хочу выполнять проверки самостоятельно (вот почему я использую аннотацию @Valid
)
вот код (абстрагирование интерфейсов, инъекций и всего остального. Чтобы сделать его простым)
package service;
class ClientService {
insert(Client c) throws ServiceException {
try {
new ClientDao().insert(c);
} catch( DaoException e) {
throw new ServiceException(e);
}
}
}
package dao;
class ClientDao {
insert(@Valid Client c) throws DaoException {
myEntityManagerOrAnyPersistenceStrategy.insert(c);
}
}
Я бы хотел изменить класс dao на что-то вроде:
package dao;
class ClientDao {
insert(@Valid Client c) throws DaoException, MyValidationException {
myEntityManagerOrAnyPersistenceStrategy.insert(c);
}
}
Но я понятия не имею, как это сделать так, как я описал.
FTRЯ использую Spring Web Flow и Hibernate в этом проекте.Модуль dao содержит @Repository
классов, а сервисный модуль содержит @Service
классов.