@(Java)[Struts|Interceptor] Struts2 更改校驗配置文件位置 在Struts2中提供的攔截器校驗 ,該校驗器中預設的配置文件位於Action包的位置下,需要和Action類放在一起,而提供的註解又不能針對每個方法不同的參數校驗,只能使用配置文件方式來實現同一個Acti ...
@(Java)[Struts|Interceptor]
Struts2 更改校驗配置文件位置
在Struts2中提供的攔截器校驗ValidationInterceptor
,該校驗器中預設的配置文件位於Action包的位置下,需要和Action類放在一起,而提供的註解又不能針對每個方法不同的參數校驗,只能使用配置文件方式來實現同一個Action不同方法實現不同的校驗。這裡配置文件的放置位置和違反了項目的結構,根據項目結構,需要把配置文件統一放置在資源包下。
原校驗配置文件放置結構如下:
重定義配置文件路徑後,項目結構如下:
註:struts-validation/後面跟著Action類名,然後該目錄下放置對該Action校驗的配置文件
註:還是SpringMVC中有入參,可以集成JSR-303,通過註解來實現比較方便
校驗配置文件重定位
通過查詢了相關資料和看了部分源碼,發現讀取配置文件的路徑已經寫死了,但是Struts2提供自定義實現該類的介面以及配置,所以可以通過自定義方式實現。
DefaultActionValidatorManager
,其中讀取配置文件的路徑部分代碼如下:
private List<ValidatorConfig> buildAliasValidatorConfigs(Class aClass, String context, boolean checkFile) {
// 獲取類全名,並將.替換為/,實現com/struts/Action/Action-alias-validation.xml類似的結構
String fileName = aClass.getName().replace('.', '/') + "-" + context + VALIDATION_CONFIG_SUFFIX;
return loadFile(fileName, aClass, checkFile);
}
private List<ValidatorConfig> buildClassValidatorConfigs(Class aClass, boolean checkFile) {
String fileName = aClass.getName().replace('.', '/') + VALIDATION_CONFIG_SUFFIX;
return loadFile(fileName, aClass, checkFile);
}
由於上面兩個方法是private的,所以只能將DefaultActionValidatorManager
的所有代碼複製過來,寫一個CustomValidatorManager
類,然後重寫上面的兩個方法。如下:
private final String VALIDATION = "struts-validation";
private String locateValidationConfig(Class<?> aClass) {
// struts-validation/Action/
return VALIDATION + File.separator + aClass.getSimpleName() + File.separator;
}
private List<ValidatorConfig> buildAliasValidatorConfigs(Class aClass, String context, boolean checkFile) {
String fileName = locateValidationConfig(aClass) + aClass.getSimpleName() + "-" + context + VALIDATION_CONFIG_SUFFIX;
return loadFile(fileName, aClass, checkFile);
}
private List<ValidatorConfig> buildClassValidatorConfigs(Class aClass, boolean checkFile) {
String fileName = locateValidationConfig(aClass) + aClass.getSimpleName().replace('.', '/') + VALIDATION_CONFIG_SUFFIX;
return loadFile(fileName, aClass, checkFile);
}
然後在struts配置文件中配置自定義實現即可:
<constant name="struts.actionValidatorManager" value="com.jabnih.struts.validate.CustomValidatorManager"/>