考虑以下情况:
我有一个“服务”模块,它有一个名为
ClientService
的类。此
ClientService
在“dao”模块中使用名为ClientDao
的类。ClientDao
有一个方法insert(@Valid Client c)
。此方法抛出DaoException
。客户是我的实体。他的属性使用 javax bean 验证进行注释,例如
@javax.validation.constraints.NotNull
。
如果违反了某些约束,ClientService
会收到一个 ConstraintViolationException
。但是 ClientService
只需要 DaoException
或“dao”模块的任何其他异常。我想保持这种方式,只抛出与对象执行的任务直接相关的异常,隐藏更高层(在这种情况下,“服务”模块)的实现细节。
我想做的是将 javax.validation.ConstraintViolationException
封装在我的“dao”模块的 ValidationException
中,并在 trows
子句,以及 DaoException
。而且我不想自己执行验证检查(这就是我使用 @Valid
注释的原因)
这是代码(抽象接口(interface)、注入(inject)和其他一切。为了简单起见)
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
类。
最佳答案
也许我不明白什么,但我想在你的情况下验证是由持久性提供者自动执行的,与你的 @Valid
注释无关。
如果是这样,您可以简单地在 DAO 方法中捕获 ConstraintViolationException
:
class ClientDao {
insert(@Valid Client c) throws DaoException, MyValidationException {
try {
myEntityManagerOrAnyPersistenceStrategy.insert(c);
} catch (ConstraintViolationException ex) {
throw new MyValidationException(...);
}
}
}
关于java - 如何检查、抛出和捕获 bean 的验证 ConstraintViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5099742/