Spring - 在DAO的验证器中提供特定错误消息的最佳方法?

时间:2009-11-07 03:11:13

标签: spring error-handling spring-mvc validation

在Spring中实现验证器访问DAO对象但需要根据DAO错误返回不同错误消息的最佳方法是什么? DAO方法是否会抛出不同的异常,验证器会变成正确的错误消息? DAO是否应返回枚举,以便验证器可以在必要时单独处理每种返回类型?我想验证器可以将org.springframework.validation.Errors对象传递给DAO,但这似乎将两个类紧密地联系在一起。

我认为最好的方法是使用枚举方法来避免异常的开销。还有其他方法我应该考虑吗?

更新

实际上,枚举可能必须是传递给DAO的引用,因为该方法必须返回实际对象。这仍然是最好的方法吗?

更新2

问题是我需要在这种特殊情况下从数据库中检索信息,而不是存储它。在验证类中,我正在检查值是否已经存在(这就是它需要DAO的原因),如果它已经存在,那么我将在页面上向用户显示该错误。我确实需要验证表单上的所有字段都已填写,所以也许这是我使用验证器的唯一方法。那么,如何处理数据库中已存在的值的错误? DAO是唯一能够知道的东西 - 将这个错误从DAO传递到Web层的最佳方法是什么?

DAO方法当前正在返回它从数据库中检索的用户对象 - 如果有错误,我可以返回null,但是这并没有给我任何关于错误细节的粒度 - 它在这一点上基本上是一个布尔值指示是否找到记录,但不是为什么。

3 个答案:

答案 0 :(得分:1)

访问DAO的Validator有效。

我建议将异常抛弃在传递枚举上。

如果再给出一个选项,我建议不要抛出异常但返回null。

您可以设计DAO方法,使它们返回填充的对象(如果可用),如果不是只返回null。

采取以下示例:

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 MVC时,可以考虑使用Spring安全性。

答案 1 :(得分:0)

  

我认为验证器可以将org.springframework.validation.Errors对象传递给DAO,但这似乎将这两个类紧密地联系在一起。

我不明白这一点。你为什么要将错误传递给DAO?

验证的目的是防止不良数据进入数据库的嗅探距离。您应该将响应发送回请求源,通知他们您遇到的任何错误。

我能想到将这样的事情传递给数据库的唯一原因是跟踪请求和响应作为审计/跟踪功能。

如果有错误,用例就完成了。需要通知用户,而不是数据库。

更新:

如果您正在检查类似于数据库中必须唯一的用户名,请务必进行检查。但是我会在输入时将其作为AJAX调用,如果它已经存在,我只是告诉用户。

DAO不应该知道网络层。糟糕的设计 - 太耦合了。

让网络层通过中间人查询。中介将进行查询并发回适当的结果。您的网页应该有一个可以作为中间人的控制器和/或服务。

答案 2 :(得分:0)

检查验证器中的数据库是一件有效的事情。

我对你期望DAO返回的错误有点困惑。通常,它将返回请求的对象或NULL,并由调用者(您的验证器)来了解原因。

如果您需要检查数据库中是否已存在多个字段,则只需进行多个DAO调用。