服务验证:如果验证失败,则抛出异常

时间:2016-10-30 21:06:15

标签: java spring hibernate validation exception

我需要你的帮助!

在我的网站项目(基于Spring MVC)中,我使用异常来表示某些验证失败,但我不确定是否采取了正确的方式。

例如我有这样的服务:

@Service
@Transactional
public class UserService {

@Autowired
private UserRepository userRepository;

public User createUser(UserDTO userDTO) throws IllegalArgumentExceptio {
    validateUserEmail(userDTO);
    return userRepository.save(new User(userDTO.getFirstName(), userDTO.getLastName(), userDTO.getEmail(), userDTO.getPassword()));
}

private void validateUserEmail(UserDTO userDTO) throws IllegalArgumentException {
        String emailPattern = "^[a-z0-9-\\+]+(\\.[a-z0-9-]+)*@"
                + "[a-z0-9-]+(\\.[a-z0-9]+)*(\\.[a-z]{2,})$";

        if (userDTO() == null) {
            throw new IllegalArgumentException(INVALID_EMAIL_NULL.getMessage());
        } else if (userDTO().length() > 25) {
            throw new IllegalArgumentException(INVALID_EMAIL_LENGTH.getMessage());
        } else if (!userDTO().matches(emailPattern)) {
            throw new IllegalArgumentException(INVALID_EMAIL_FORMAT.getMessage());
        }
    }
}

我已经读过这个article了。另外我知道还有一种方法是使用Hibernate Validator。

所以,主要问题是:哪一种方法是最佳实践,为什么?

  1. 像我一样在验证期间抛出异常。
  2. 使用类似notification pattern的内容。
  3. 使用Hibernate Validator。

2 个答案:

答案 0 :(得分:1)

显然,使用 Hibernate验证器进行Bean验证,这是现成的库是最好的方法,因为我们不需要为最小长度/最大长度重写大量代码等..明确的验证。

另外,如果你自己重写了minlength / maxlength验证的逻辑,你需要进行大量的测试,以确保编写的代码是正确的,这是必须的。

拇指规则,如果某些可信代码已经可用,请不要再尝试重新发生/重写,而只是使用它,这称为 DRY(不要重复自己)原则,在任何编程中都非常重要

答案 1 :(得分:0)

这是一个非常糟糕的主意。我想到您的解决方案的一个问题是:如果您的电子邮件验证失败,您将如何通知用户?我会去custom validation annotation。如果电子邮件验证失败,您只需返回false即可。使用这种方法,如果电子邮件验证失败,您也可以轻松通知用户,因为BindingResult只会包含错误。另外,另一个好处是错误消息的本地化。所以是的,Hibernate validatior是要走的路。