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

Jua*_*lez 7 java spring spring-mvc

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

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

提前致谢.

Ser*_*sta 6

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

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

RequestAttributes reqAttr = RequestContextHolder.getRequestAttributes();
HttpServletRequest req = ((ServletRequestAttributes) reqAttr).getRequest();
Run Code Online (Sandbox Code Playgroud)


Bon*_*ond 5

你应该采用AOP方式.

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();
}
Run Code Online (Sandbox Code Playgroud)