簡體   English   中英

我應該在哪里放置需要訪問數據庫的驗證碼?

[英]Where should I place validation code that requires access to database?

我有一個Spring MVC網頁,用於密碼重置。 這要求我們執行以下驗證工作流程:

  1. 提供用戶名或電郵
  2. 如果提供電子郵件,請確保它是有效的格式(例如:@Email)
  3. 檢查用戶是否存在:

    3a)嘗試通過用戶名從數據庫加載用戶
    3b)如果按用戶名加載返回null ,請嘗試通過電子郵件從數據庫加載用戶

  4. 加載后,檢查用戶是否未被鎖定: user.isLocked()

目前,我在org.springframework.validation.Validator擁有所有這些Validations

但是,這要求我的Validator可以訪問UserService對象,以便加載用戶。 這會導致用戶加載2次,一次由我的驗證器加載,第二次由我的Controller加載,因此它可以調用.resetPassword(User)


問題:我應該在哪里查看第3項?

這些驗證更適合控制器嗎? 如果我按原樣保留驗證,我可以從Validator返回用戶(由於Validator接口,它有void方法)嗎?

在我看來,步驟3和4根本不屬於視圖層(特別是控制器執行的驗證)。

這些步驟是此方案的業務邏輯的基本部分,因此它們應在服務層中實現。

您的服務層應該提供諸如的方法

public void resetPasswordByUsernameOrEmail(String usernameOrEmail) { ... }

並且這些步驟應該在此方法中與resetPassword(User)一起發生。

如果需要,可以通過拋出異常,返回booleanenum (如果要區分不同的錯誤條件)使控制器知道此方法的結果。

按順序回答您的問題:

  1. 您應該在UserDao中檢查用戶是否存在。
  2. ,這些驗證不應該在控制器中。 . 財務主管不應該對驗證有任何了解,否則它會嘗試太多,我們會犯下
  3. 由於您使用的接口定義了具有void返回的方法,因此如果您想要返回User,則必須執行以下操作之一:
    • 在Validator實現中創建自己的方法 這樣做的缺點是您不能有效地使用多態,因為您將依賴於未在接口中定義的方法。
    • 創建自己的Validator (可能創建自己的接口,擴展Spring的Validator接口並定義您想要的方法)。 這可能是我選擇的。

也許這是一個重復: Spring MVC Bean驗證

另一種解決方案是:

在我工作的一個項目中,我們曾經有一個SpringBeanUtil類。 它將獲得WebApplicationContext,並通過靜態方法獲取所需的bean。 這有點難看,但在這些問題上有所幫助。

使用風險自負。

public class SpringBeanUtil implements ApplicationContextAware{

private static ApplicationContext APPLICATION_CONTEXT;

@Override
public void setApplicationContext(ApplicationContext applicationContext)
        throws BeansException {
    APPLICATION_CONTEXT=applicationContext;
}

public static Object getBean(String name){
    return APPLICATION_CONTEXT.getBean(name);
}
public static <T> T getBean(Class<T> type){
    return APPLICATION_CONTEXT.getBean(type);
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM