【问题标题】:Access to Controller's method parameter values from Spring MVC interceptor从 Spring MVC 拦截器访问 Controller 的方法参数值
【发布时间】:2014-08-27 13:57:12
【问题描述】:

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

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

提前致谢。

【问题讨论】:

  • 我可能误解了您要做什么,但HandlerMethod.getMethodParameters() 没有返回您需要的信息吗?
  • @geoand from MethodParameter javadoc "封装方法参数规范的帮助类"
  • 你的意思是你需要传递给方法的实际参数?
  • 是的,以便与他们一起评估可能的 SpEL 表达式。
  • 恐怕我对此没有任何建议。你能解释一下为什么你需要在拦截器中评估 SpEL 吗?你想达到什么目的?

标签: java spring spring-mvc


【解决方案1】:

您应该采用 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();
}

【讨论】:

  • 正如我在问题中所说,我无法从拦截器访问控制器方法的实际参数。据我所知,HandlerMethod只是一种识别将被调用的方法的方法。
  • 感谢您的回答。这是我正在考虑的选项之一。采用 AOP 方式,我应该包括对所有带注释的方法的请求。我认为拦截器是一种更自然的方式。
  • 很高兴为您提供帮助 :) 正如 Serge 在他的回答中提到的,您不需要将请求包含为带注释的方法参数。如果您能够实现目标,请告知。
  • 感谢您的关注。目前通过 AOP 实现它,看起来不错。
【解决方案2】:

你不能在拦截器的preHandle方法中使用控制器方法参数,因为在调用它的时候,控制器方法的参数还没有被构造(除了请求和响应)。

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

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

【讨论】:

  • 上面的代码有一个小的语法错误。应该是:code RequestAttributes reqAttr = RequestContextHolder.getRequestAttributes(); HttpServletRequest req = ((ServletRequestAttributes) reqAttr).getRequest();
猜你喜欢
  • 2023-03-17
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2014-05-19
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
相关资源
最近更新 更多