编辑
我认为存在一些困惑,我没有在 Controller 中使用以下两种方法。我只是使用“doMethod(HttpServletRequest request)”。然后我的建议就会得到应用并发挥作用。我的问题是“doMethod(HttpServletRequest request)”不需要 HttpServletRequest 参数,只有应用于它的建议才使用它。所以我想知道是否可以将我的方法从“doMethod(HttpServletRequest request)”更改为“doMethod()”,但仍然能够拦截 HttpServletRequest 并将建议应用于它(因为我知道 spring 可以在某处访问它)
在 Spring MVC 中你可以有这样的方法:
@RequestMapping
public void doMethod() {
//some logic here
}
如果我需要其他参数,我可以将其更改为:
@RequestMapping
public void doMethod(HttpServletRequest httpServletRequest) {
//some logic with request
}
无论哪种方式,spring都会委托(delegate)给相同的方法,但如果我通过一些魔法(我不明白)添加它,请为我填写参数
我的问题是像这样执行 aop 时:
@Before(value=(execution(* * com.domain.package.doMethod(..)), argNames=httpServletRequest)
public void advice(HttpServletRequest httpServetRequest) {
//some before advice
}
这在应用于第二个方法定义时是有意义的,但是当它不包含“HttpServletRequest”参数时,如何才能使其与第一个方法一起使用?
最佳答案
我认为你不能做你想做的事。 Spring MVC 注入(inject)参数,从 HTTP 请求中获取它们(属性、URL 等)。它们还支持“内置”参数列表,如果提及,则始终发送这些参数。
当您的 Controller 在 HTTP 请求上下文中正常调用时,HttpRequest
的实例将始终被发送,因此永远不会调用此方法的第一个无参数版本。
要调用它,您应该将其映射到不同的 URL、不同的 HTTP 方法或不同的内容类型。
关于java - Spring 对缺少参数的 MVC 方法的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9768640/