gpt4 book ai didi

java - 如何检查、抛出和捕获 bean 的验证 ConstraintViolationException

转载 作者:搜寻专家 更新时间:2023-11-01 03:29:11 25 4
gpt4 key购买 nike

考虑以下情况:

  • 我有一个“服务”模块,它有一个名为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com