【发布时间】:2015-09-17 18:19:39
【问题描述】:
我有一个抽象基础 POGO:
abstract class AuthorizingResource {
void authorize(String credential) {
if(!credentialIsValid(credential)) {
throw new AuthorizationException(credential)
}
}
boolean credentialIsValid(String credential) {
// Do stuff to determine yea or nay
}
}
还有很多像这样的具体子类:
class FizzResource extends AuthorizingResource {
List<Fizz> getAllFizzes(String credential) {
authorize(credential)
List<Fizz> fizzes
// Do stuff
fizzes
}
Fizz getFizzById(String credential, Long id) {
authorize(credential)
Fizz fizz
// Do stuff
fizz
}
void considerTheLillies(Buzz buzz) {
// Do stuff
}
void upsertFizz(String credential, Fizz fizz) {
authorize(credential)
// Do stuff
}
}
如您所见,发生了几件事:
- 我想要验证/授权的任何
FizzResource方法,我需要在方法顶部手动调用authorize(...) - 某些方法 (
considerTheLillies) 不需要经过身份验证
我想知道我是否可以通过使用闭包来调用 authorize(...) 来模仿 AOP(所以我不必盲目地添加它),它可以使用某种模式来选择要“包装”在关闭。在FizzResource 的特定情况下,这将是任何包含“*Fizz*”的方法,但该模式应该是(理想情况下)任何有效的正则表达式。 不能改变的一件事是任何接受credential arg 的方法都不能修改其签名。
基本上,类似于 Spring AOP 或 Google Guice 的方法拦截器,但使用原生 Groovy 闭包。
有什么想法吗?
【问题讨论】:
-
您是否尝试过使用
invokeMethod拦截方法调用并在适用的情况下调用authorize?这是一个示例答案:stackoverflow.com/questions/19580008/groovy-mop-invokemethod/…
标签: java regex groovy closures aop