我试图在Spring论坛和搜索StackOverflow上找到这个问题的答案。我发现很多页面都描述了可怕的架构,并且要求和我做同样的事情,但我的用途是不同的,所以请耐心等待: - )
我有一个Spring 2.5项目,使用基于注释的表单控制器基本上是这样的:
@RequestMapping("/edit/someObject")
public String handleSubmit(HttpServletRequest request, HttpServletResponse response, SomeObject someObject, BindingResult result) {
// Some check here
if(result.hasErrors()) {
return "form";
} else {
SomeObjectService.update(someObject);
return "redirect:/view/someObject";
}
}
在此我检查HttpServletRequest中的一些http属性,如果此属性具有特定值,则使用HttpServletResponse发送重定向。完成此检查的是此应用程序中的很多(但不是全部)表单控制器。我想要做的是创建一个由一些AOP建议处理的@CheckedSubmit注释来执行此检查,然后从控制器中删除HttpServletRequest和HttpServletResponse参数。
我的问题是我不知道如何从这个AOP建议中访问当前的HttpServletRequest和HttpServletResponse而不将这两个作为(未使用的)参数用于带注释的方法,这是我首先想要避免的。 / p>
总结:如何在@RequestMapping带注释的方法上从AOP建议访问HttpServletRequest / Response?
答案 0 :(得分:13)
摘要的两个解决方案,但不是完整的问题
解决方案1:内部建议(> =需要Spring 2.0)
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.getRequestAttributes()).getRequest();
解决方案2:内部方面类(可能需要在singelton bean中使用Spring 3.0!)
@Autowired(required=true)
private HttpServletRequest request;
答案 1 :(得分:3)
我想你可能已经知道了,但是“官方”是在Spring中做到这一点MVS是使用HandlerInterceptors。它们不是注释驱动的,但它们会插入到HTTP控制流中,并获得对请求和响应的完全访问权。