【问题标题】:How to communicate return value and validation errors to the caller of a method?如何将返回值和验证错误传达给方法的调用者?
【发布时间】:2014-11-03 16:13:15
【问题描述】:

我正在我的 Spring 应用程序的服务层中创建一个类。

一种方法是:

/**
* Creates a new user account.
* @return Returns true if the password reset went ok, otherwise false.
*/
boolean confirmPasswordReset(UserAccount account, String confirmationId, String newPassword);

但是,此方法签名无法向调用者提供任何可能导致确认失败的信息。我有验证规则;密码不能是用户名,密码必须有8个字符等等。如果用户未能提供强密码,我想拒绝确认并返回 false。不过我也想传达验证错误。

所以我有以下解决方案,但我不确定这是否是一个好主意。这是我的尝试:

(我使用 Java 8,因此使用 Optional 类)

public class OperationResult<T> {

    private Optional<T> returnObject;
    private List<ConstraintViolation> violations;

    public OperationResult(Optional<T> returnObject, List<ConstraintViolation> violations) {
        this.returnObject = returnObject;
        this.violations = violations;
    }

    public Optional<T> getReturnObject() {
        return returnObject;
    }

    public List<ConstraintViolation> getViolations() {
        return violations;
    }
}

那我把服务层方法的返回值改成:

OperationResult<Boolean> confirmPasswordReset(UserAccount account, String confirmationId, String newPassword);

这只是一个例子,但我有几种方法会很有用。

从设计的角度来看,这看起来很糟糕吗?由于密码太弱,或者密码与用户名相同而引发异常似乎不是一个好的解决方案。

【问题讨论】:

  • 如果密码太短并且与用户名相同,那么您希望向用户显示两个验证错误还是只显示其中一个?
  • 两个错误,我想向调用者提供错误信息。
  • 还要注意 Optional 不可序列化...
  • 这是在 JSF webapp 中吗?理想情况下,该操作不应在提醒用户之前调用confirmPasswordReset; Web 层组件(验证器等)应该防止这种情况发生

标签: java spring jakarta-ee


【解决方案1】:

抛出一个包含列表违规的自定义异常:

void confirmPasswordReset(UserAccount account, String confirmationId, String newPassword) throws ValidationException

ValidationException 可能被选中或未选中。

【讨论】:

    【解决方案2】:

    我可以看到的两种简单方式:

    1. 返回带有验证错误的数组或列表:

      String[] confirmPasswordReset(UserAccount account, String confirmationId, String newPassword);
      

      在这种情况下,您必须检查返回数组的长度。如果长度为0,则密码有效。

    2. 您可以保留布尔值并传递一个额外的 List&lt;String&gt; 参数,然后该参数会被方法中的验证错误填充。

       boolean confirmPasswordReset(UserAccount account, String confirmationId, String newPassword, List<String> aValidationErrors);
      

    此外,除了将您的验证作为字符串返回之外,您还可以定义一个 Enum 以及相应的错误消息。

    【讨论】:

    • 是的,所以基本上我在这里做了什么,除了我有更好的封装。
    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 2011-01-05
    • 2019-11-19
    • 2014-11-18
    • 1970-01-01
    • 2011-07-26
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多