Как проверить, сгенерировать и поймать проверку bean-компонента ConstraintViolationException - PullRequest
4 голосов
/ 24 февраля 2011

Рассмотрим следующий случай:

  • У меня есть модуль "serivce", класс которого называется ClientService.

  • This ClientService использует класс с именем ClientDao в модуле "dao".

  • ClientDao имеет метод insert(@Valid Client c).Этот метод выдает DaoException.

  • Клиент - моя сущность.Его атрибуты аннотированы валидациями Javax-бинов, например @javax.validation.constraints.NotNull.

Если нарушено какое-либо ограничение, ClientService получает ConstraintViolationException.Но ClientService ожидает только DaoException или любое другое исключение модуля "dao".И я хочу, чтобы все было так, выкидывая исключения, относящиеся только к той задаче, которую выполняет объект, скрывая детали реализации для более высокого уровня (в данном случае, для модуля «service»).

Что бы я хотелкак это сделать, это инкапсулировать javax.validation.ConstraintViolationException в ValidationException моего "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 классов.

1 Ответ

2 голосов
/ 24 февраля 2011

Возможно, я чего-то не понимаю, но, полагаю, в вашем случае проверка выполняется автоматически провайдером постоянства и не имеет никакого отношения к вашей аннотации @Valid.

Если это так, вы можете просто перехватить ConstraintViolationException внутри вашего метода DAO:

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