我有一个方面拦截了日志记录方法。该日志记录方法是一个将一个对象作为参数的简单方法:
logMessage(Object message)
如何在我的方面修改该对象并记录一个新对象?以下不起作用:
void around() : execution(* com.test.logMessage(..)) {
String message = thisJoinPoint.getArgs()[0].toString();
String pattern = "abc";
String replacement = "xyz";
message = message.replaceAll(pattern, replacement);
proceed(message);
}
我收到ajc: too many arguments to proceed, expected 0
错误。
答案 0 :(得分:1)
proceed
方法将对象数组作为参数。您应该可以通过以下方式调用它来解决您的问题:
Object[] args = new Object[] { message };
proceed(args);
答案 1 :(得分:0)
您可以使用如下:
@Before("execution(* com.package.package.*(..)) && args(token,..)")
public void getAllAdvice(JoinPoint joinPoint, String token) throws Throwable {
authorizationService.authorizeToken(token);
}
答案 2 :(得分:0)
我认为您的班级名称不是包test
中的小写com
,而是包Logger
中的真实班级名称com.test
,好吗?
使用main方法的示例记录器类:
package com.test;
public class Logger {
public void logMessage(Object message) {
System.out.println(message);
}
public static void main(String[] args) {
new Logger().logMessage("Hello abc!");
}
}
<强>方面:强>
访问和操作方法参数的最简单方法是通过args()
将其绑定到参数。
package de.scrum_master.aspect;
import com.test.Logger;
public aspect LogManipulator {
void around(Object message) : execution(* Logger.logMessage(*)) && args(message) {
proceed(message.toString().replaceAll("abc", "xyz"));
}
}
控制台日志:
Hello xyz!
Etvoilà!