zoukankan      html  css  js  c++  java
  • Struts2 更改校验配置文件位置

    @(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"/>
  • 相关阅读:
    题解-CF617E XOR and Favorite Number
    题解-P3174 [HAOI2009]毛毛虫
    数论相关
    力扣 403 青蛙过河 搜索 || 动态规划
    【转载】剑指Offer 26 树的子结构
    三元组 蓝桥杯
    剑指 Offer 14- I. 剪绳子
    【转载】剑指 Offer 43. 1~n整数中1出现的次数
    n个节点的二叉树有几种情况
    1044. 最长重复子串 二分 + Rabin-Karp | | 后缀数组
  • 原文地址:https://www.cnblogs.com/jabnih/p/5720659.html
Copyright © 2011-2022 走看看