考虑以下情况:
我有一个“服务”模块,它有一个名为
ClientService
.这
ClientService
使用了一个ClientDao
在“dao”模块中调用的类。ClientDao
有方法insert(@Valid Client c)
。此方法抛出DaoException
.客户是我的实体。他的属性使用 javax bean 验证进行注释,例如
@javax.validation.constraints.NotNull
.
如果违反了某些约束,则ClientService
接收一个ConstraintViolationException
. 但ClientService
只期望DaoException
或任何其他“dao”模块的异常。我想保持这种状态,抛出仅与对象执行的任务直接相关的异常,隐藏更高层的实现细节(在这种情况下,“服务”模块)。
我想做的是封装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 模块包含@Service
类。