考虑以下情况:
>我有一个“serivce”模块,它有一个名为ClientService的类.
>此ClientService在“dao”模块中使用名为ClientDao的类.
> ClientDao有一个方法插入(@Valid Client c).此方法抛出DaoException.
>客户是我的实体.他的属性使用javax bean验证注释,如@ javax.validation.constraints.NotNull.
如果违反某些约束,ClientService将收到ConstraintViolationException.但ClientService只需要DaoException或“dao”模块的任何其他Exception.我希望保持这种方式,抛出只与对象执行的任务直接相关的异常,隐藏更高层的实现细节(在这种情况下,“服务”模块).
我想要做的是在我的“dao”模块的ValidationException中封装javax.validation.ConstraintViolationException,并在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类.
最佳答案 也许我不明白,但我想在你的情况下验证是由持久性提供程序自动执行的,与你的@Valid注释无关.
如果是这样,您可以在DAO方法中捕获ConstraintViolationException:
class ClientDao {
insert(@Valid Client c) throws DaoException, MyValidationException {
try {
myEntityManagerOrAnyPersistenceStrategy.insert(c);
} catch (ConstraintViolationException ex) {
throw new MyValidationException(...);
}
}
}