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

时间:2019-05-14 14:19:22

标签: spring spring-mvc spring-aop spring-aspects

我有一个带有一个RequestMapping方法的控制器类,该方法带有String参数。我想通过使用Spring AOP传递此参数,但是它失败了,在打印值时得到空值。

尝试了以下提供的解决方案,但它与map一起使用,但不适用于String。

Spring AOP pass argument of a controller method

@Controller
public class WelcomeController {
    @Autowired
    private FamilyService familyService;

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView welcomePage(String welcomeMessage) {
        FamilyVO allFamilyMembers = familyService.getAllFamilyMembers();
        ModelAndView modelAndView = new ModelAndView("Index", "family", allFamilyMembers);
        List<String> familyMemberAges = new ArrayList<String>();
        for (int i = 0; i <= 100; i++) {
            familyMemberAges.add("" + i);
        }
        modelAndView.addObject("familyMemberAges", familyMemberAges);
        System.out.println(welcomeMessage);
        return modelAndView;
    }
}
@Component
@Aspect
public class WelcomeControllerAspect {
    @Before("execution(* com.kalavakuri.webmvc.web.controller.WelcomeController.welcomePage(..))")
    public void beforeWelcomePage(JoinPoint joinPoint) {
        joinPoint.getArgs()[0] = "Hellow";
        System.out.println(joinPoint.getArgs().length);
        System.out.println("Before welcomepage");
    }
}

当我在Controller类中打印但打印null时,我期望值是“ Hello”。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

@Before建议并不意味着要操纵方法参数。在该示例中,链接到它的示例仅起作用,因为该参数是可变对象,即MapString是不可变的,但是您无法对其进行编辑。

话虽如此,你应该怎么办?使用专门针对此类事情的@Around建议。在那里,您可以决定要如何进行操作,例如

  • 使用原始参数调用原始方法,
  • 使用更改后的参数调用原始方法,
  • 在调用原始文件之前和/或之后进行一些操作,
  • 不调用原始方法,而是返回另一个结果,
  • 在原始方法中处理异常
  • 或上述各项的任何合理组合(也许您有多种情况,并且if-elseswitch-case)。

我还建议不要直接在Object[]的{​​{1}}上工作,而应通过JoinPoint.getArgs()将相关的方法参数绑定到已命名且类型安全的建议参数。试试这个:

args()