我的Spring Web模型 - 视图 - 控制器(MVC)框架中有这个类。我正在使用面向方面编程(AOP),这是一种编程范例,旨在通过分离横切关注点来增加模块性。 这个课程的一切都很好
@Aspect
public class MarketingAspect extends ServiceSupport {
@Pointcut("execution(* com.tdk.iot.services.client.LicenseService.*(..))")
public void handleServiceMethod() {
}
@Pointcut("execution(* com.tdk.iot.services.client.ApplicantService.*(..))")
public void handleApplicantServiceMethod() {
}
@Before("com.tdk.iot.services.aop.ApplicantAspect.handleServiceMethod()")
public void before(JoinPoint _jp) {
User user = getLDAPUser();
if(user != null &&( (user.getUserRole() != UserRole.MARKETING)) {
throw new NoSufficientRoleException(user == null ? null : user.getUserRole(), UserRole.MARKETING);
}
}
@Before("com.tdk.iot.services.aop.ApplicantAspect.handleApplicantServiceMethod()")
public void checkRolebefore(JoinPoint _jp) {
User user = getLDAPUser();
if(user != null &&( (user.getUserRole() != UserRole.MARKETING))) {
throw new NoSufficientRoleException(user == null ? null : user.getUserRole(), UserRole.MARKETING);
}
}
}
我已更改方法表示法getLDAPUser,现在接收HttpServletRequest请求作为参数,因此我将方法修改为
@Before("com.tdk.iot.services.aop.ApplicantAspect.handleApplicantServiceMethod()")
public void checkRolebefore(JoinPoint _jp, HttpServletRequest request) {
User user = getLDAPUser(request);
if(user != null &&( (user.getUserRole() != UserRole.MARKETING))) {
throw new NoSufficientRoleException(user == null ? null : user.getUserRole(), UserRole.MARKETING);
}
}
并且修改了这个方法后我得到了这个错误
java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut
在我的XML中:
<!-- Scan for aspects -->
<aop:aspectj-autoproxy />
<bean id="marketingAspect" class="com.tdk.iot.services.aop.MarketingAspect" />
答案 0 :(得分:1)
首先是AspectJ基础知识:错误formal unbound in pointcut
只是意味着你的建议声明了一个未被相应切入点使用(绑定)的参数。您可以通过args()
,this()
,target()
,@annotation()
等将参数绑定到通知方法参数。
具体问题是,在您的建议中,您声明参数HttpServletRequest request
。价值应该从哪里来?相应的切入点似乎拦截了另一个方面的建议方法,该方法没有HttpServletRequest
类型的任何参数。因此,只要您没有源代码就可以使用servlet请求,您必须自己创建一个实例。
我的印象是你需要先了解一下AOP。随意发布更多代码并解释您想从哪里获取对象,然后我可以帮助您修复代码。