Java 使用注释从Spring2.5中的AOP通知访问HttpServletRequest

Java 使用注释从Spring2.5中的AOP通知访问HttpServletRequest,java,spring,annotations,aop,Java,Spring,Annotations,Aop,我试图在Spring论坛和通过搜索StackOverflow找到这个问题的答案。我发现很多页面描述了可怕的体系结构,并询问了与我相同的问题,但我的预期用途不同,因此请容忍我:-) 我有一个Spring 2.5项目,使用基于注释的表单控制器,基本上如下所示: @RequestMapping("/edit/someObject") public String handleSubmit(HttpServletRequest request, HttpServletResponse response,

我试图在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发送重定向。此检查是针对此应用程序中的许多(但不是全部)表单控制器执行的。我想做的是创建一个@CheckedSubmit注释,由一些AOP建议处理以执行此检查,然后从控制器中删除HttpServletRequest和HttpServletResponse参数

我的问题是,我不知道如何从这个AOP建议中访问当前的HttpServletRequest和HttpServletResponse,而不将这两个作为(未使用的)参数使用到带注释的方法中,这是我首先试图避免的


小结:如何在@RequestMapping注释的方法上从AOP通知访问HttpServletRequest/Response?

我想您可能已经知道了这一点,但是“官方”在Spring MVS中这样做是使用HandlerInterceptors。它们不是注释驱动的,但它们确实被插入到HTTP控制流中,并获得对请求和响应的完全访问权。

两种解决方案用于摘要,但不用于整个问题(完全)

解决方案1:内部建议(>=需要Spring 2.0)

解决方案2:内部方面类(可能需要Spring3.0内部singelton bean!)


是的,我知道。我的问题是,对于每个方法,这应该是稍微可配置的。注释将是这方面的理想选择,因为它们允许一种非常简单的方法来处理额外的参数。是的,我可以看出这将是一种限制。另一种选择是编写自己的HandlerAdapter实现,可能是将AnnotationMethodHandlerAdapter子类化。我自己从来没有这样做过,但它可能会给你灵活性,让你做你需要的事情。加上一句话,解决方案2适用于使用@Configurable(需要AspectJ)时Spring未实例化的对象,请检查我在这个线程中的回答。我解释并提供了一个示例代码
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
        .getRequestAttributes()).getRequest();
@Autowired(required=true)
private HttpServletRequest request;