Spring - лучший подход для предоставления конкретных сообщений об ошибках в валидаторе от DAO?

Каков наилучший способ реализовать валидатор в Spring, который обращается к объекту DAO, но должен возвращать различные сообщения об ошибках, основанные на ошибке DAO? Должен ли метод DAO выдавать различные исключения, которые валидатор превращает в правильные сообщения об ошибках? Должен ли DAO возвращать перечисление, чтобы валидатор мог обрабатывать каждый тип возврата отдельно, если это необходимо? Я предполагаю, что валидатор может передать объект org.springframework.validation.Errors в DAO, но это, кажется, связывает два класса слишком близко друг к другу.

Я считаю, что лучший подход - это метод перечисления, чтобы избежать накладных расходов на исключения. Есть ли другой способ, который я должен рассмотреть?

Обновить

На самом деле, перечисление, вероятно, должно быть ссылкой, передаваемой в DAO, поскольку этот метод должен возвращать реальный объект. Это все еще лучший подход?

Обновление 2

Проблема в том, что мне нужно извлекать информацию из базы данных в данном конкретном случае, а не сохранять ее. В классе проверки я проверял, существует ли уже значение (вот почему ему нужен DAO), и если оно уже существует, это ошибка, которую я хотел бы показать пользователю на странице. Мне нужно проверить, что все поля в форме были заполнены, так что, возможно, это единственное, для чего я использую валидатор. Затем, как я могу обработать ошибку, когда значение уже существует в базе данных? DAO - это единственное, что будет знать, - как лучше всего сообщить об этой ошибке от DAO на веб-уровень?

Метод DAO в настоящее время возвращает пользовательский объект, который он извлекает из базы данных - я могу вернуть ноль, если есть ошибка, но это не дает мне никакой детализации в деталях ошибки - это по сути логическое значение в этой точке, указывающее, является ли запись найдена или нет, но не почему.

7.11.2009 03:11:12
Валидация должна происходить на веб-уровне и / или уровне обслуживания. Почему валидатор должен иметь дело с DAO?
duffymo 7.11.2009 03:18:16
Так для чего же используются валидаторы? Простые вещи, например, убедитесь, что все поля являются обязательными или имеют заданную длину? Если это так, то почему бы просто не использовать JavaScript (который, я знаю, можно отключить)? Если единственное подтверждение мне нужно сделать, чтобы увидеть, есть ли что-то в базе данных, я должен сделать это только на уровне обслуживания (через DAO)? Кроме того, я думал, что валидатор предоставил способ легко отображать ошибки на странице, чтобы их было удобно использовать.
David Buckley 7.11.2009 03:33:09
То, как я это сделал, совсем не проверяет поле. Вместо этого, когда я пытаюсь сохранить объект команды, возникает исключение, которое всплывает обратно в веб-слой. Там есть блок перехвата, ожидающий исключения, который создает дружественное сообщение для пользователя.
bpapa 7.11.2009 14:21:56
@David - JavaScript на стороне клиента, конечно, но это не освобождает вас от необходимости делать это и на стороне сервера - именно по той причине, на которую вы ссылались. Я думаю, что сервис должен нести ответственность за собственную валидацию, как с точки зрения JavaScript, так и за более глубокие проверки бизнеса. Если бы я писал это весной, я бы поручил службе проверять каждый параметр, который был передан в качестве предварительного условия для варианта использования.
duffymo 7.11.2009 15:32:51
3 ОТВЕТА

Я предполагаю, что валидатор может передать объект org.springframework.validation.Errors в DAO, но это, кажется, связывает два класса слишком близко друг к другу.

Я не понимаю этого. Зачем вам передавать ошибки в DAO?

Смысл проверки состоит в том, чтобы предотвратить попадание неверных данных на расстояние, на котором они находятся. Вы должны отправить ответ обратно источнику запроса, сообщив им о любых ошибках, с которыми вы столкнулись.

Единственная причина, по которой я могу подумать о передаче такой информации в базу данных, заключается в том, чтобы отслеживать запросы и ответы как функцию аудита / отслеживания.

Если есть ошибки, вариант использования готов. Пользователь должен быть информирован, а не ваша база данных.

ОБНОВИТЬ:

Если вы проверяете что-то вроде имени пользователя, которое должно быть уникальным в базе данных, обязательно делайте эту проверку. Но я бы сделал это как вызов AJAX, как только он был введен, и если бы он уже существовал, я бы просто сказал об этом пользователю.

DAO не должна знать о веб-уровнях. Плохой дизайн - слишком спаренный.

Пусть веб-уровень запрашивает через посредника. Посредник сделает запрос и отправит обратно соответствующий результат. Ваша веб-страница должна иметь контроллер и / или какую-либо службу, которая может быть таким посредником.

0
7.11.2009 20:00:02
Мне нужно извлекать информацию из базы данных, а не хранить ее. В классе проверки я проверял, существует ли уже значение, и если да, то это ошибка, которую я хотел бы показать пользователю на странице. Мне нужно проверить, что все поля в форме были заполнены, так что, возможно, это единственное, для чего я использую валидатор. Затем, как я могу обработать ошибку, когда значение уже существует в базе данных? DAO - это единственное, что будет знать, - как лучше всего сообщить об этой ошибке от DAO на веб-уровень?
David Buckley 7.11.2009 19:37:23
Проверка заключается в том, чтобы убедиться, что данные, поступающие в базу данных, действительны со всех точек зрения. Если вы делаете запрос, а он не существует, это не место для проверки. Если вы проверяете, есть ли что-то вроде имени пользователя, которое должно быть уникальным в базе данных, обязательно делайте эту проверку. Но я бы сделал это как вызов AJAX, как только он был введен, и если бы он уже существовал, я бы просто сказал об этом пользователю. DAO не должна знать о веб-уровнях. Плохой дизайн - слишком спаренный. Пусть веб-уровень запрашивает через посредника. Посредник сделает запрос и отправит обратно соответствующий результат.
duffymo 7.11.2009 19:58:17

Проверка базы данных в вашем валидаторе - действительная вещь.

Я немного озадачен тем, какие ошибки вы ожидаете от DAO. Обычно он либо возвращает запрошенный объект, либо NULL, и вызывающий (ваш валидатор) должен знать причину.

Если вам нужно проверить, что в базе данных еще нет нескольких полей, просто сделайте несколько вызовов DAO.

0
11.11.2009 07:21:46

Доступ валидатора к DAO действителен.

Я бы предложил бросить исключение при прохождении перечисления.

Если бы мне дали еще один вариант, я бы предложил не выбрасывать исключение, а возвращать ноль.

Вы можете разрабатывать свои методы DAO таким образом, чтобы они возвращали заполненный объект, если он доступен, если не просто возвращали ноль.

Возьмите следующий пример:

Уровень DAO:

 class UserInfoProvider {
    public void createUser(User user) throws UserCreationException {
      // throws UserCreationException when something goes wrong while updating database
    } 

    public User findUser(String username) {
       // return user object if found

       // else just return null
    }
 }

Проверка :

class UserValidator {
     public void validate(command, errors) {
        String username = command.getUsername();
        UserInfoProvider userInfoProvider;
        User user = userInfoProvider.findUser(username);
        if (user == null) {
          errors.rejectValue("username","User not found");
          return;
        }
     }
  }

Вы можете рассмотреть возможность использования безопасности Spring при использовании Spring MVC.

2
12.11.2009 14:44:04