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