Spring MVC Spring AOP传递控制器方法的String参数

vlurs2pr  于 2022-11-15  发布在  Spring
关注(0)|答案(2)|浏览(198)

我有一个控制器类,其中有一个RequestMapping方法,该方法接受String参数。我想通过使用Spring AOP传递此参数,但失败了,当我打印值时,我得到了空值。
尝试以下提供的解决方案,但它的工作与Map,但不与字符串。
Spring AOP pass argument of a controller method
第一个
我在Controller类中打印值“Hello”时预期该值为空。

axr492tv

axr492tv1#

一个@Before建议并不意味着要操作方法参数。在这个例子中,你链接到它只是因为参数是一个可变的对象,也就是一个Map。一个String是不可变的,但是你不能编辑它。
话虽如此,你应该怎么做呢?使用@Around建议,它是为这类事情设计的。在那里你可以决定你想如何进行,例如。

  • 使用原始参数调用原始方法,
  • 使用更改的参数调用原始方法,
  • 在调用原始对象之前和/或之后执行某些操作,
  • 不调用原始方法而是返回另一个结果,
  • 处理原始方法中的异常
  • 或者上述任何有意义的组合(也许你有多个案例和if-elseswitch-case)。

我还建议不要直接在JoinPoint.getArgs()Object[]上工作,而是通过args()将相关的方法参数绑定到一个命名的和类型安全的建议参数。

package de.scrum_master.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class WelcomeControllerAspect {
  @Around(
    "execution(* com.kalavakuri.webmvc.web.controller.WelcomeController.welcomePage(..)) && " +
    "args(welcomeMessage)"
  )
  public Object beforeWelcomePage(ProceedingJoinPoint joinPoint, String welcomeMessage) throws Throwable {
    System.out.println(joinPoint + " -> " + welcomeMessage);
    return joinPoint.proceed(new Object[] { "Hello AOP!" });
  }
}
oiopk7p5

oiopk7p52#

您应该使用@Around建议而不是@Before。有关详细信息,请参阅this answer

相关问题