2014-11-03 60 views
1

我在我的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,因此可選類)

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); 

這只是一個例子,但我有幾個方法,這將是有用的。

從設計的角度看,這看起來不好嗎?拋出異常是因爲密碼太弱,或者密碼與用戶名相同,看起來不是一個好的解決方案。

+2

如果密碼太短,並且與用戶名相同,那麼您希望向用戶或其中的一個顯示驗證錯誤? – 2014-11-03 16:31:22

+0

這兩個錯誤,我想給調用者提供什麼是錯誤的信息。 – LuckyLuke 2014-11-03 16:55:53

+0

另請注意,可選不是可序列化的... – keuleJ 2014-11-03 17:27:39

回答

2

引發自定義異常與列表侵犯它:

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

的ValidationException可能被選中或取消選中。

0

兩種簡單的方法,我可以看到:

  1. 返回數組或列表與驗證錯誤:

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

    在這種情況下,你就必須檢查數組長度返回。如果長度爲0,那麼密碼是有效的。

  2. 您可以保留布爾值並傳遞一個附加的List<String>參數,然後使用該參數填充驗證錯誤。

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

此外,而不是返回您的驗證爲一個字符串,你也可以定義與相應的錯誤消息的Enum

+0

是的,所以基本上我在這裏做了什麼,除了我有更好的封裝。 – LuckyLuke 2014-11-03 17:27:24

相關問題