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

标签 java spring exception-handling bean-validation

考虑以下情况:

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

相关文章:

java - 如何自动格式化java代码以添加大括号

java - Spring Batch - 了解 block 大小和 ItemReadListener 之间的行为

PHP - 将所有错误转换为异常 - 好还是坏?

java - 我应该创建 private static final String = "Some exception message"还是将其留在代码中?

java - Android:通过 View 激活的方法传递 2 个输入参数

具有 maven 依赖项的 Java ClassNotFoundException

java - 将数组划分为 k 个连续的子数组,使得每个子数组的和的按位与最大

java - 无法在 Spring/Postman 中上传多部分文件和 dto 对象内容类型 'application/octet-stream' 不受支持

spring - 关于 spring <util :map> 的特定用例的问题

c# - 我应该用 try-catch 语句附上什么类型的代码块?