1

Say I have the following method definition in a Spring service layer:

@Override
public boolean passwordsMatch(String encrypted, String plain) {
      if (encrypted == null || encrypted.isEmpty() || plain == null || plain.isEmpty()) {
            throw new IllegalArgumentException("One argument is null or empty");
        }
      return passwordEncoder.matches(plain, encrypted);
   }

It is called by a Spring MVC application controller that wants to check whether the new password provided by a user (here called "plain") matches the user's current password (here called "encrypted").

Should I really be throwing an IllegalArgumentException (or any subtype of RuntimeException) if the new password provided by the user is empty (plain.isEmpty())?

I am 95% sure I am going to remove this check but I'd be curious to hear arguments in favor of keeping the check in this particular case.

4

2 回答 2

2

IllegalArgumentException每当您在方法中遇到您不喜欢的参数时,应该是您的首选(这正是此异常的目的)。因此,除非您已经拥有(或觉得需要实施)更具体/更有意义的异常,否则为了保持一致性,我认为坚持使用 IllegalArgument/IllegalState 是可以的。

但是,在异常消息中指出您不喜欢的特定参数可能是个好主意。顺便说一句,Guava 通过其实用程序为此类验证提供了非常好的支持Preconditions

Preconditions.checkArgument(encrypted != null && !encrypted.isEmpty(), "The old password hash is empty");
Preconditions.checkArgument(plain != null && !plain.isEmpty(), "The new password is empty");

既然您已经阐明了实际的问题范围,我想说您是唯一一个在弄清楚该方法应该检查的内容之后,决定您的方法是否应该在提供 null 或空参数的情况下继续执行的人。

根据您的方法的名称,我会说它最多应该不允许null值,因为空密码仍然可以与其加密表示相匹配。“最小密码长度”规则很可能应该在其他地方实施;此方法应该只报告普通密码是否与哈希匹配,而不管它是否是合法密码。

于 2013-10-09T21:04:00.380 回答
1

我写得太快了。该方法似乎是某种用于比较密码的服务方法。域无关紧要。IllegalArgumentException在这种特定情况下,如果提供的参数是null例如,则抛出一个是有意义的,但对于空字符串则不是,因为这实际上可能是一个密码。


在涉及域验证的用例中,我不会使用IllegalArgumentException. 如果密码为空,您的User实例(或其他)将不会处于有效状态。因此,您应该抛出某种InvalidDomainException,例如。InvalidPasswordException(或将 aBindingResult与 a 一起使用Validator)。

于 2013-10-09T20:38:15.063 回答