Spring aop: 如何在增強方法中獲取並修改目標函數的參數


總結網上的方法,自己實驗了一下,目標函數如下:

@RequestMapping(value="/dispatch",produces = "text/html; charset=UTF-8")  
         @ResponseBody 
        @ControllerPointcut(str = "OKOK") 
         public String dispatch(@RequestParam("messageA") String messageA,
                                 @RequestParam("messageB") String messageB,
                                 @RequestParam("messageC") String messageC)throws Exception{  
             return "<script>alert('"+messageA+messageB+messageC+"');</script>";  
         }

增強方法:

@Pointcut("@annotation(com.annotation.ControllerPointcut)")
    private void controller(){}


@Around("controller()")
    public Object test(ProceedingJoinPoint pjp) throws Throwable{
        Object[] args = pjp.getArgs();
        for(Object obj : args){
            System.out.println("arguments: "+obj);
        }
        Object args0 = args[0];
        Object args2 = args[2];
        args[0] = args2;
        args[2] = args0;
        Object retVal = pjp.proceed(args);
        return retVal;
    }

頁面ajax:

$.ajax({
        url:"test/dispatch.do",
        type:"post",
        dataType:"html",
        data:{messageA:"This", messageB:"Is", messageC:"Message"},
        success:function(result){
            $("#container-top").append(result);
        }
    });

結果:

頁面:

MessageIsThis

Eclipse控制台:

arguments: This
arguments: Is
arguments: Message

 

總結:

1.ProceedingJoinPoint對象取到的args[]內的 參數順序 就是 目標函數聲明時的參數順序,可以逐一對應

2.直接通過 args[‘index’] = ...  方式來修改,再通過 Object retVal = pjp.proceed(args); return retVal; 即可改變並傳入參數;

3.如果對象方法的參數中包括 HttpServletRequest request, 那么直接調用其getParameterMap().put(...)方法改變Parameter會報錯“parameterMap is locked”,而其set相關的方法又只有setAttribute,即設置用於多個controller方法跳轉的attribute,就算設置成某parameter相同的名字,也無法覆蓋,畢竟是不一樣的對象。所以,通過截獲request本身來改變參數的方法行不通。

4.另外還有在聲明@annotation時,加入args(..) 這樣的方法可以直接截獲目標函數的參數,但,暫時不知道,如何只通過這個方法修改參數並傳回目標函數。。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM