4

考虑以下情况:

  • 我有一个“服务”模块,它有一个名为ClientService.

  • ClientService使用了一个ClientDao在“dao”模块中调用的类。

  • ClientDao有方法insert(@Valid Client c)。此方法抛出DaoException.

  • 客户是我的实体。他的属性使用 javax bean 验证进行注释,例如@javax.validation.constraints.NotNull.

如果违反了某些约束,则ClientService接收一个ConstraintViolationException. 但ClientService只期望DaoException或任何其他“dao”模块的异常。我想保持这种状态,抛出仅与对象执行的任务直接相关的异常,隐藏更高层的实现细节(在这种情况下,“服务”模块)。

我想做的是封装javax.validation.ConstraintViolationExceptionValidationException我的“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类。

4

1 回答 1

2

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

ConstraintViolationException如果是这样,您可以简单地在您的 DAO 方法中捕获:

class ClientDao {
    insert(@Valid Client c) throws DaoException, MyValidationException {
        try {
            myEntityManagerOrAnyPersistenceStrategy.insert(c);
        } catch (ConstraintViolationException ex) {
            throw new MyValidationException(...);
        }
    }
}
于 2011-02-24T08:56:50.723 回答