public interface BusinessResource {
@RequiresAuthorization
public ResponseEnvelope getResource(ParamObj param);
}
@Component
public class BusinessResourceImpl implements BusinessResource {
@Autowired
public Response getResource(ParamObj param) {
return Response.ok().build();
}
}
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class AuthorizerAspect {
protected static final Logger LOGGER =
LoggerFactory.getLogger(AuthorizerAspect.class);
@Autowired
public AuthorizerAspect() {
LOGGER.info("Break point works here..." +
"so spring is creating the aspect as a component...");
}
@Around(value="@annotation(annotation)")
public Object intercept(ProceedingJoinPoint jp,
RequiresAuthorization annotation) throws Throwable {
LOGGER.info("BEGIN");
jp.proceed();
LOGGER.info("END");
}
}
注意:在接口级别的注释中,甚至不会创建代理,而在实现级别的注释将为资源创建代理。
问题是:是否有一种方法来通知注释只出现在接口上的对象?
对于那些像我一样发现没有通过代理对Spring AOP上的限制进行排序的直接方法的人来说,这个替代方案可能会有用:
public interface BusinessResource {
@RequiresAuthorization
public ResponseEnvelope getResource(ParamObj param);
}
和
@Component
public class BusinessResourceImpl implements BusinessResource {
@Autowired
public Response getResource(ParamObj param) {
return Response.ok().build();
}
}
和
import import org.aopalliance.intercept.MethodInvocation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AuthorizerAspect {
protected static final Logger LOGGER =
LoggerFactory.getLogger(AuthorizerAspect.class);
@Autowired
public AuthorizerAspect() {
LOGGER.info("Break point works here..." +
"so spring is creating the aspect as a component...");
}
public Object invoke(MethodInvocation invocation) throws Throwable {
LOGGER.info("BEGIN");
invocation.proceed();
LOGGER.info("END");
}
@Bean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
return new DefaultAdvisorAutoProxyCreator();
}
@Bean("requiresAuthorizationPointcut")
public AbstractPointcutAdvisor createPointcut() {
return new AbstractPointcutAdvisor() {
private static final long serialVersionUID = 4733447191475535406L;
@Override
public Advice getAdvice() {
return AuthorizerAspect.this;
}
@Override
public Pointcut getPointcut() {
return new StaticMethodMatcherPointcut() {
@Override
public boolean matches(Method method, Class<?> targetClass) {
if (method.isAnnotationPresent(RequiresAuthorization.class)) {
return true;
}
if (method.getDeclaringClass().isInterface()) {
String methodName = method.getName();
try {
Method targetMethod = targetClass.getMethod(methodName, method.getParameterTypes());
return targetMethod != null && targetMethod.isAnnotationPresent(RequiresAuthorization.class);
} catch (NoSuchMethodException |
SecurityException e) {
LOGGER.debug("FAILURE LOG HERE",
e.getMessage());
return false;
}
}
return method.isAnnotationPresent(RequiresAuthorization.class);
}
};
}
};
}
}
问题内容: 我想用Spring / AOP和注解实现声明式安全性。如您在下一个代码示例中看到的,我使用参数“ allowedRoles”定义了“受限注释”,用于定义允许谁执行建议的方法。 现在的问题是,在我的建议中,我无法访问已定义的注释: 上面的方法总是返回null(根本没有找到注释)。有一个简单的解决方案吗? 我阅读了有关使用AspectJ代理的内容,但我不希望使用此代理。 问题答案: 我认为
null 代码是用Java7和Spring3.1.3编写的。 我试过另一种方法。我使用“around”建议而不是“before”和“after”来访问ProcedingJoinPoint。在这个建议中,我通过反射检查方法是否具有注释'com.xyz.WithAuthorization': 我的批注有'@retentionpolicy.runtime),但我在调试器中看到,在运行时,方法签名中缺少批
我使用Spring AOP拦截方法执行。 我有一个界面,如下所示: 以下是接口的实现: 现在我希望任何使用@AwesomeAnnoting注释的参数的方法都应该被Spring AOP捕获。 所以我写了以下方面,这是有效的。 但是,当我尝试查找参数注释时,我没有得到任何注释。如上所述,annotationMatrix为空。 所以我的问题是: 为什么annotationMatrix为空?可能是因为参数
我正在为以下问题寻找一个切实可行的解决方案: 外部库提供组件作为基类。 通过扩展这些基类生成自定义组件。 当实现引发未处理的异常时,基类将中断。 基类源代码不可用。只有二进制jar。 有人知道如何用AspectJ做这个吗?
我有以下问题: 我已经为安全性创建了注释: 在我具有类之间的继承性的情况下,是否也有可能所有类都具有@Security注释来获得最具体的定义? 约西
我正在尝试创建一个@after aop注释,以便在方法完成后执行代码。当我通过参数时,我面临问题。 方面代码- 最终- 控制器- 这会引发错误: 错误引用的类型不是注释类型:finalEvent 但是,如果我从FinalEvent接口中删除“value”属性并更改为@annotation(FinalEvent),它就可以工作。但我需要传递参数。 如果我修改为@Pointcut(“@annotati