【发布时间】:2014-11-12 05:45:59
【问题描述】:
我已经为 cmets 上的 CRUD 操作定义了一个类。 read 方法被重载了。
class Comment{
// method 1: returns all the comments by a user
findAll(long userId, long subjectId, String param);
// method 2: returns all the comments of all the users
findAll(long subjectId, String param)
}
我试过的切入点表达式是
@Around("execution(* com.package..*Controller.findAll(..)) && args(userId,subjectId,..)")
public Object validateFindAll(final ProceedingJoinPoint proceedingJoinPoint, final long userId, final long subjectId) {
// validate userId, if available
// validate subjectId
}
问题:由于 userId 和 subjectId 的数据类型相同,点表达式应用于方法 2 时,会将参数值移动 1 位。这意味着,表达式不理解第一个参数 userId 未传递。相反,userId 将“subjectId”作为值,而 subjectId 将相邻参数“param”作为其值。
注意
我试图避免编写另一种方法,例如 findUserComments()。
我想保持整个应用程序的一致性。还有其他类具有类似的 CRUD 操作模式。
问题:是否可以定义一个适用于这两种方法的表达式,第一个参数 userId 是可选的?
编辑 - 解决方案 虽然我正在尝试以下解决方案中建议的不同方法,但我最终删除了方法 2。我在方法 1 中处理这种情况。
【问题讨论】:
标签: spring aop spring-aop pointcut pointcuts