中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java增加自定義注解進行校驗入參的方法是什么

發布時間:2023-04-18 10:21:00 來源:億速云 閱讀:105 作者:iii 欄目:開發技術

這篇文章主要介紹“Java增加自定義注解進行校驗入參的方法是什么”,在日常操作中,相信很多人在Java增加自定義注解進行校驗入參的方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java增加自定義注解進行校驗入參的方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

注解類

這里有三個參數,分別是三個參數名稱,起始時間參數名稱,結束時間參數名稱,需要校驗的參數名稱

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface VerifyParameters {
    /**
     * 起始時間參數名稱
     */
    String startTimeParamName() default "startTime";
    /**
     * 結束時間參數名稱
     */
    String endTimeParamName() default "endTime";

    /**
     * 需要校驗的參數名稱
     */
    String paramName() default "";
}

注解的Aspect類

這里貼一個完整的,目的是有的小伙伴想用的話,貼過去就能用。

@Component
@Aspect
public class VerifyParametersAspect {

    private static final Logger logger = LoggerFactory.getLogger(VerifyParametersAspect.class);

    /**
     * 切點
     */
    @Pointcut("@annotation(com.guava.mall.app.annotation.VerifyParameters)")
    public void serviceAspect() {
    }


    /**
     * service 方法前調用
     *
     * @param joinPoint
     */
    @Before("serviceAspect()")
    public void doBeforeService(JoinPoint joinPoint) {
        try {

            //獲取方法參數名
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            //獲取方法
            Method method = signature.getMethod();
            //獲取參數名
            LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
            String[] parameterNames = u.getParameterNames(method);
            Map<String, Object> params = new HashMap<>(8);
            params = getParamMap(joinPoint, method, parameterNames, params);
            //獲取注解
            VerifyParameters verifyParameters = method.getAnnotation(VerifyParameters.class);

            //參數名
            String paramName = verifyParameters.paramName();
            Object o = params.get(paramName);
            ValidationUtils.validate(o == null, "參數不能為空");
            ValidationUtils.validate(!atLeastOnePropertyNotNull(o), "請至少輸入一個查詢條件進行查詢和導出");
            //開始時間和結束時間的參數名
            String s = verifyParameters.startTimeParamName();
            String e = verifyParameters.endTimeParamName();
            Map<?, ?> map = JSONUtils.bean2Map(o);
            Object startTime = map.get(s);
            Object endTime = map.get(e);
            if (startTime != null || endTime != null) {
                ValidationUtils.validate(startTime == null || endTime == null, "開始時間和結束時間必須同時存在");
                ValidationUtils.validate(Integer.parseInt(String.valueOf(endTime)) - Integer.parseInt(String.valueOf(startTime)) > 30 * 24 * 60 * 60, "時間間隔不能超過一個月");
            }
        } catch (NumberFormatException ex) {
            logger.error(ex.getMessage(), ex);
        }

    }

    private Map<String, Object> getParamMap(JoinPoint joinPoint, Method method, String[] parameterNames, Map<String, Object> params) {

        int i = 0;
        if (parameterNames != null && parameterNames.length > 0) {
            for (String parameterName : parameterNames) {
                params.put(parameterName, joinPoint.getArgs()[i]);
                i++;
            }
        }
        return params;
    }

    public static boolean atLeastOnePropertyNotNull(Object obj) {
        for (Field field : obj.getClass().getDeclaredFields()) {
            //忽略serialVersionUID
            if ("serialVersionUID".equals(field.getName())) {
                continue;
            }
            field.setAccessible(true);
            try {
                if (field.get(obj) != null && !field.get(obj).toString().isEmpty()) {
                    return true;
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return false;
    }
    /**
     * 方法后調用
     */
    @After("serviceAspect()")
    public void doAfterInService(JoinPoint joinPoint) {
    }

}

然后,解釋一下

MethodSignature signature = (MethodSignature) joinPoint.getSignature();

這是我們的第一行代碼,這里的joinPoint對象表示應用建議的程序執行點,getSignature()方法則會返回正在執行的方法的方法簽名,簽名里就包含了該方法名稱返回類型參數類型。然后再強制轉換成MethodSignature對象,便于訪問方法相關的信息。

MethodSignature是一個對象,它表示正在執行的方法的簽名,包括方法名稱、返回類型和參數類型。它是Spring AOP框架中的一個類,用于在切面中獲取方法的信息。

Method method = signature.getMethod();獲取方法

這個則是從MethodSignature中獲取到了正在執行的方法信息。

LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();

LocalVariableTableParameterNameDiscoverer是一個類,它可以用于在運行時獲取方法參數的名稱。它是Spring框架中的一個類,通常與反射一起使用,以便在運行時獲取有關方法參數的信息。

通過 String[] parameterNames = u.getParameterNames(method); 可以獲取到目前方法的入參名稱。

getParamMap(); 方法則會返回一個key是參數名稱,value是參數本身的map對象。 我們可以從中取出我們需要的那個參數對象。

VerifyParameters verifyParameters = method.getAnnotation(VerifyParameters.class);

上邊這行代碼則會獲取到方法上注解的注解對象本身,和我們傳入的參數值,因為每個方法的入參不盡相同,里邊時間的字段也不盡相同,需要主動傳入來做處理。

這里再解釋下atLeastOnePropertyNotNull()方法,這個方法的作用是判斷參數內的屬性是否至少有一個不為空,這里我們忽略了serialVersionUID

serialVersionUID是Java中的一個序列化機制,用于在反序列化期間驗證發送方和接收方的對象是否具有兼容的序列化版本。如果發送方和接收方的serialVersionUID不同,則反序列化將失敗。如果未指定serialVersionUID,則Java運行時將根據類的特定方面自動生成它。

之后的方法就很簡單了,拿出值根據我們的需要做處理即可

controller

再看看是如何使用的吧,添加@VerifyParameters注解,傳入時間的屬性名稱,和需要校驗的參數名稱,這里傳入參數名稱的原因是,可能和我這里一樣還有其他的參數影響,而我們只想校驗我們需要的參數。

@ApiOperation(value = "查詢列表")
@GetMapping("/test")
@VerifyParameters(startTimeParamName = "beginTime", endTimeParamName = "endTime",paramName = "orderRequest")
public Page<Map<String, Object>> findOrderTestList(Pageable pageable, ERPOrderRequest orderRequest) {
    log.info("模擬邏輯處理");
    return null;
}

到此,關于“Java增加自定義注解進行校驗入參的方法是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

延津县| 临汾市| 砀山县| 和顺县| 邵阳市| 油尖旺区| 汶川县| 菏泽市| 桦川县| 清徐县| 兴文县| 阿鲁科尔沁旗| 富川| 宣化县| 盐池县| 华安县| 兴文县| 康定县| 花莲县| 明星| 冕宁县| 宁晋县| 颍上县| 谢通门县| 讷河市| 自贡市| 凌海市| 班玛县| 延川县| 全州县| 海淀区| 龙州县| 宜川县| 平顺县| 会昌县| 铜梁县| 梓潼县| 乌兰察布市| 平顶山市| 水富县| 陆良县|