Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问控制器';来自Spring MVC拦截器的s方法参数值_Java_Spring_Spring Mvc - Fatal编程技术网

Java 访问控制器';来自Spring MVC拦截器的s方法参数值

Java 访问控制器';来自Spring MVC拦截器的s方法参数值,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在用SpringMVC开发一个RESTWebService,并实现了一个自定义注释,以便用它注释控制器方法。此注释可能包含一个SpEL表达式,我必须考虑控制器方法参数值来计算该表达式。因此,我的想法是为此实现一个SpringMVC拦截器,但preHandle方法中的参数HandlerMethod只是一种识别方法的方法,不提供对控制器方法参数值的访问。因此,我能想到的唯一方法是开发一个SpringAOP方面,并拦截对带注释方法的所有调用。顺便说一句,我需要访问请求,所以如果我采用AOP方式,所

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

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


提前谢谢。

你应该走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();
}

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

因此,您必须按照JavaBond answer中解释的AOP方式(不要忘记在控制器中实现一个方法…)。但是多亏了spring框架,您可以避免所有带注释的方法都应该在请求中包含参数
RequestContextHolder.getRequestAttributes()
提供一个
RequestAttributes
对象。如果您知道您的请求
HttpServletRequest
,则可以将其强制转换为
ServletRequestAttributes
,然后通过
getRequest()
方法访问本机请求:

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

我可能误解了您的意图,但是
HandlerMethod.getMethodParameters()
没有返回您需要的信息吗?@geo和MethodParameter javadoc中的“封装方法参数规范的助手类”您的意思是您需要传递给方法的实际参数吗?是的,为了评估可能的SpEL表达,我恐怕没有任何建议。您能解释一下为什么需要在拦截器中评估SpEL吗?您想要实现什么?正如我在问题中所说的,我无法从拦截器访问控制器方法的实际参数。据我所知,HandlerMethod只是一种识别将被调用的方法的方法。谢谢你的回答。这是我一直在考虑的选择之一。按照AOP的方式,我应该包括对所有带注释方法的请求。我认为拦截器是一种更自然的方式。很乐意帮忙:)正如Serge在他的回答中提到的,您不需要将请求作为带注释的方法参数包含在内。让我们知道你是否能够实现你的目标。谢谢你的关注。目前它是通过AOP实现的,看起来不错。上面的代码中有一个小的语法错误。应该是:
code-RequestAttributes-requestr=RequestContextHolder.getRequestAttributes();HttpServletRequest req=((ServletRequestAttributes)reqAttr.getRequest()