Spring MVC:正式未绑定切入点

时间:2016-11-15 10:48:21

标签: java spring spring-mvc aop

我的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" />

1 个答案:

答案 0 :(得分:1)

首先是AspectJ基础知识:错误formal unbound in pointcut只是意味着你的建议声明了一个未被相应切入点使用(绑定)的参数。您可以通过args()this()target()@annotation()等将参数绑定到通知方法参数。

具体问题是,在您的建议中,您声明参数HttpServletRequest request。价值应该从哪里来?相应的切入点似乎拦截了另一个方面的建议方法,该方法没有HttpServletRequest类型的任何参数。因此,只要您没有源代码就可以使用servlet请求,您必须自己创建一个实例。

我的印象是你需要先了解一下AOP。随意发布更多代码并解释您想从哪里获取对象,然后我可以帮助您修复代码。