[英]Where should I place an XSD file to use for JAXB code gen and for XML validation
[英]Where should I place validation code that requires access to database?
我有一個Spring MVC網頁,用於密碼重置。 這要求我們執行以下驗證工作流程:
檢查用戶是否存在:
3a)嘗試通過用戶名從數據庫加載用戶
3b)如果按用戶名加載返回null
,請嘗試通過電子郵件從數據庫加載用戶
加載后,檢查用戶是否未被鎖定: 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)
一起發生。
如果需要,可以通過拋出異常,返回boolean
或enum
(如果要區分不同的錯誤條件)使控制器知道此方法的結果。
按順序回答您的問題:
也許這是一個重復: 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.