日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文介紹了將@ModelAttribute解析為方法參數的切入點表達式的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我有一個@ModelAttribute(鍵)在@CONTRONTERADVICE中定義,并且我在多個控制器方法中使用相同的模型屬性作為方法參數,因為(鍵)將在所有控制器中都可用。

我正在控制器類中添加屬性(鍵),如下所示。

@RequestMapping(value = "/", method = RequestMethod.GET)
public String list(final Model model,@ModelAttribute("key") final boolean key) { 
...
...
}

我要截取方法參數為@ModelAttribute("key")的所有控制器方法。

我的方面文件如下所示。

@Component
@Aspect
@EnableAspectJAutoProxy
public class myAspectclass {

@Pointcut("execution(public * *(.., @org.springframework.web.bind.annotation.ModelAttribute(boolean key)))")
          public void methodWithAnnotatedParameter() {}

@Around("methodWithAnnotatedParameter()")
public String blahMethod(ProceedingJoinPoint PJP){

blah blah

....
}

但是我的服務器啟動失敗,提示

[Tomcat:Launch]原因:java.lang.IlLegalArgumentException:PointCut格式不正確:應在字符位置97處使用‘名稱模式’

[Tomcat:啟動]執行(PUBLIC**(..,@org.springframework.web.bind.annotation.ModelAttribute(boolean Key),..)

我無法理解這種情況下的錯誤…我在語法上做錯了什么嗎?

注意:MyModelAttribute(key)在參數列表中沒有任何具體位置

引用this答案:

推薦答案

這里是獨立的AspectJ示例(不是Spring應用程序,但方面語法應該相同)。

驅動程序應用程序:

如您所見,有幾個帶有和不帶有@ModelAttribute參數注釋的方法,其中一個甚至帶有兩個帶注釋的參數(無論是否有意義,但這只是一個示例)。

package de.scrum_master.app;

import java.util.Collection;
import java.util.Map;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;

public class Application {
  public String list(Model model, @ModelAttribute("key") boolean key) {
    return "x";
  }

  public String foo(Model model, @ModelAttribute("key") boolean key, @ModelAttribute(name = "key") String text) {
    return "x";
  }

  public String bar(@ModelAttribute(name = "key") int number) {
    return "x";
  }

  public String zot(Model model, @ModelAttribute("XXX") boolean key) {
    return "x";
  }

  public String baz(Model model, boolean key, String text) {
    return "x";
  }

  public String bla(@ModelAttribute("XXX") int number) {
    return "x";
  }

  public static void main(String[] args) {
    Model model = new Model() {
      @Override public Model mergeAttributes(Map<String, ?> arg0) { return null; }
      @Override public boolean containsAttribute(String arg0) { return false; }
      @Override public Map<String, Object> asMap() { return null; }
      @Override public Model addAttribute(String arg0, Object arg1) { return null; }
      @Override public Model addAttribute(Object arg0) { return null; }
      @Override public Model addAllAttributes(Map<String, ?> arg0) { return null; }
      @Override public Model addAllAttributes(Collection<?> arg0) { return null; }
    };
    Application application = new Application();
    application.list(model, true);
    application.foo(model, true, "hey");
    application.bar(11);
    application.zot(model, true);
    application.baz(model, true, "hey");
    application.bla(11);
  }
}

方面:

方面匹配具有至少一個帶有@ModelAttribute注釋的參數的所有方法執行。如果您只想查找這些方法,而不考慮注釋參數值,那么切入點就足夠了。但正如您所說,您只想匹配具有value = "key"的注釋,我們需要使用反射來查看注釋本身并過濾掉不需要的注釋。

另一個復雜情況是,根據@ModelAttribute JavaDoc,參數namevalue是彼此的別名,即我們還需要檢查這兩個參數的值才能完全正確。

package de.scrum_master.aspect;

import java.lang.annotation.Annotation;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ModelAttribute;

@Aspect
@Component
public class ModelAttributeInterceptor {
  @Pointcut("execution(public * *(.., @org.springframework.web.bind.annotation.ModelAttribute (*), ..))")
  public void methodWithAnnotatedParameter() {}

  @Around("methodWithAnnotatedParameter()")
  public String blahMethod(ProceedingJoinPoint thisJoinPoint) throws Throwable {
    MethodSignature methodSignature = (MethodSignature) thisJoinPoint.getSignature();
    Annotation[][] annotationMatrix = methodSignature.getMethod().getParameterAnnotations();
    boolean foundModelAttribute = false;
    for (Annotation[] annotations : annotationMatrix) {
      for (Annotation annotation : annotations) {
        if (!(annotation instanceof ModelAttribute))
          continue;
        ModelAttribute modelAttribute = (ModelAttribute) annotation;
        if ("key".equals(modelAttribute.value()) || "key".equals(modelAttribute.name())) {
          if (!foundModelAttribute) {
            System.out.println(thisJoinPoint);
            foundModelAttribute = true;
          }
          System.out.println("  " + modelAttribute);
        }
      }
    }
    return (String) thisJoinPoint.proceed();
  }
}

控制臺日志:

execution(String de.scrum_master.app.Application.list(Model, boolean))
  @org.springframework.web.bind.annotation.ModelAttribute(name=, value=key, binding=true)
execution(String de.scrum_master.app.Application.foo(Model, boolean, String))
  @org.springframework.web.bind.annotation.ModelAttribute(name=, value=key, binding=true)
  @org.springframework.web.bind.annotation.ModelAttribute(name=key, value=, binding=true)
execution(String de.scrum_master.app.Application.bar(int))
  @org.springframework.web.bind.annotation.ModelAttribute(name=key, value=, binding=true)

這篇關于將@ModelAttribute解析為方法參數的切入點表達式的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,

分享到:
標簽:ModelAttribute 切入點 參數 方法 表達式 解析
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定