从Spring MVC拦截器访问Controller的方法参数值

时间:2014-07-07 06:55:04

标签: java spring spring-mvc

我正在使用Spring MVC开发REST Web服务,并且我已经实现了自定义注释,以便用它来注释控制器方法。此注释可能包括SpEL表达式,我必须考虑控制器方法参数值进行评估。所以,我的想法是为此实现一个Spring MVC拦截器,但是preHandle方法中的参数HandlerMethod只是一种识别方法的方法,并且不提供对控制器方法参数值的访问。因此,我能想到的唯一方法是开发Spring AOP方面并拦截所有对带注释方法的调用。顺便说一句,我需要访问请求,所以如果我按照AOP方式,所有带注释的方法都应该包含请求的参数。

所以,我的问题是:有没有办法从thr Spring MVC拦截器访问方法参数值,还是应该采用Spring AOP方式?。

提前致谢。

2 个答案:

答案 0 :(得分:6)

您不能在拦截器的preHandle方法中使用控制器方法参数,因为在调用它时,尚未构造控制器方法的参数(请求和响应除外)。

所以你必须采用AOP方式(不要忘记在控制器中实现一个方法......),如JavaBond答案中所述。但是由于spring框架,您可以避免所有带注释的方法都应该包含请求的参数。 RequestContextHolder.getRequestAttributes()为您提供了RequestAttributes个对象。如果您知道自己的请求 HttpServletRequest,则可以将其转换为ServletRequestAttributes,然后通过getRequest()方法访问原生请求:

RequestAttributes reqAttr = RequestContextHolder.getRequestAttributes();
HttpServletRequest req = ((ServletRequestAttributes) reqAttr).getRequest();

答案 1 :(得分:5)

你应该采用AOP方式。

针对您的自定义注释撰写Around建议。 around建议应该有一个ProceedingJoinPoint参数。使用此方法,您可以通过proceedingJoinPoint.getArgs()

获取带注释的方法参数值

示例建议如下所示

@Around("@annotation(yourCustomAnnotation)")
public Object arooundAdvice(ProceedingJoinPoint joinpoint,
        YourCustomAnnotation yourCustomAnnotation) throws Throwable {

    Object args[] = joinpoint.getArgs();
    // iterate over the args[] array to get the annotated method arguments
    return joinpoint.proceed();
}