如何检查,抛出和捕获bean的验证ConstraintViolationException

时间:2011-02-24 02:36:15

标签: java spring exception-handling bean-validation

考虑以下情况:

  • 我有一个“serivce”模块,它有一个名为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注释的原因)

这里是代码(抽象接口,注入和其他所有内容。使其变得简单)

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个类。

1 个答案:

答案 0 :(得分:2)

也许我不明白,但我想在你的情况下,验证是由持久性提供程序自动执行的,与你的@Valid注释无关。

如果是这样,您只需在DAO方法中捕获ConstraintViolationException

class ClientDao {
    insert(@Valid Client c) throws DaoException, MyValidationException {
        try {
            myEntityManagerOrAnyPersistenceStrategy.insert(c);
        } catch (ConstraintViolationException ex) {
            throw new MyValidationException(...);
        }
    }
}