如何在拦截器上设置Spring 3.1 MVC控制器上的对象?

时间:2011-12-17 13:53:17

标签: java spring spring-mvc interceptor

自升级到3.1以来,我遇到了一些与拦截器相关的问题。在3.0.x及更早版本中,我使用以下模式拦截Spring MVC控制器:

  1. 创建一个名为RoleAware的界面,用于定义一个或多个setter。
  2. 让一个或多个控制器实现接口
  3. 注册一个新的全局拦截器,它在preHandle中执行“处理器实例RoleAware”检查
  4. 如果拦截器是RoleAware的实例,则在实现控制器上设置一个或多个对象
  5. 第一个问题是3.1中的内容发生了变化,因此检查实例失败了。我已经通过在servlet上下文配置中使用新的显式元素来解决这个问题。与检查实例相比,这不是一个大问题,也不是一个更清洁的方法。

    第二个问题是,当我尝试将处理程序(Controller)强制转换为RoleAware接口时,我得到一个ClassCastException。

    我想要一个解决方案,使我能够继续在拦截的控制器上任意设置对象。例如,在截获的任何控制器上设置Role对象。另外,我想更多地了解3.1中导致这种情况发生变化的变化。

1 个答案:

答案 0 :(得分:2)

reference doc说:

  

使用RequestMappingHandlerMapping时,实际的处理程序是   HandlerMethod的实例,用于标识特定的控制器   将被调用的方法。

所以我猜你应该把处理程序转换为HandlerMethod,调用它的getBean()方法,并检查返回的bean是RoleAware的实例。

虽未经过测试。您可以尝试使用调试器来检查处理程序参数,看看它既不是处理程序本身也不是HandlerMethod。