Java 如何从拦截器在Spring3.1MVC控制器上设置对象?

Java 如何从拦截器在Spring3.1MVC控制器上设置对象?,java,spring,spring-mvc,interceptor,Java,Spring,Spring Mvc,Interceptor,自从升级到3.1后,我遇到了一些与拦截器相关的问题。在3.0.x版和更早版本中,我使用以下模式拦截Spring MVC控制器: 创建一个名为RoleAware的接口,它定义一个或多个setter 让一个或多个控制器实现该接口 注册一个新的全局拦截器,该拦截器在预处理中执行“handler instanceof RoleAware”检查 如果拦截器是RoleWare的实例,则在实现控制器上设置一个或多个对象 第一个问题是3.1中发生了一些更改,因此instanceof检查失败。我通过在servle

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

  • 创建一个名为RoleAware的接口,它定义一个或多个setter
  • 让一个或多个控制器实现该接口
  • 注册一个新的全局拦截器,该拦截器在预处理中执行“handler instanceof RoleAware”检查
  • 如果拦截器是RoleWare的实例,则在实现控制器上设置一个或多个对象
  • 第一个问题是3.1中发生了一些更改,因此instanceof检查失败。我通过在servlet上下文配置中使用新的显式元素解决了这个问题。没有什么大不了的,而且比instanceof check更干净

    第二个问题是,当我试图将处理程序(控制器)强制转换到RoleWare接口时,我得到一个ClassCastException

    我想要一个解决方案,使我能够继续在截获的控制器上任意设置对象。例如,在被拦截的任何控制器上设置角色对象。此外,我还想了解更多关于3.1中导致此中断的更改。

    说明:

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

    因此,我想您应该将处理程序强制转换为
    HandlerMethod
    ,调用其
    getBean()
    方法,并检查返回的bean是否是
    RoleAware
    的实例


    不过还没有测试过。您可以尝试使用调试器检查处理程序参数,看看它是什么,如果它既不是处理程序本身,也不是HandlerMethod。

    好问题,特别是因为处理程序参数的API文档说:“处理程序-选择要执行的处理程序,用于类型和/或实例评估”是的,我发现这是正确的,并通过测试确认。处理程序从控制器类更改为HandlerMethod包装类。虽然不太理想,但我现在必须在preHandle方法开始时将处理程序强制转换为handler方法进行检查,然后再次强制转换为接口,以便设置对象。