我正在使用Spring MVC开发REST Web服务,并且我已经实现了自定义注释,以便用它来注释控制器方法。此注释可能包括SpEL表达式,我必须考虑控制器方法参数值进行评估。所以,我的想法是为此实现一个Spring MVC拦截器,但是preHandle方法中的参数HandlerMethod只是一种识别方法的方法,并且不提供对控制器方法参数值的访问。因此,我能想到的唯一方法是开发Spring AOP方面并拦截所有对带注释方法的调用。顺便说一句,我需要访问请求,所以如果我按照AOP方式,所有带注释的方法都应该包含请求的参数。
所以,我的问题是:有没有办法从thr Spring MVC拦截器访问方法参数值,还是应该采用Spring AOP方式?。
提前致谢。
答案 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();
}