【问题标题】:Using a custom annotation on a Spring MVC controller method from an interceptor在拦截器的 Spring MVC 控制器方法上使用自定义注释
【发布时间】:2011-09-21 15:23:44
【问题描述】:

我有一个自定义注释,我用它注释了我的控制器中的一个方法以及一个@ReqestMapping。

目标是使用 HandlerInterceptor 的自定义注释中设置的值来执行任务。

我已映射拦截器 (HandlerInterceptorAdaptor) 并执行。如果我在具体的拦截器中设置断点,我可以检查 HttpServletRequest、HttpServletResponse 和处理程序对象。但是,我看不到如何 1,获取请求试图访问的方法 2,获取该方法上的注释和 3,当然,获取注释设置的值。

谁能指点我这方面的好文档?

请,谢谢。

【问题讨论】:

  • 有人在这方面取得进展吗?

标签: java model-view-controller spring annotations


【解决方案1】:

在 Spring 3.1 中,我们引入了 HandlerMethod 抽象来表示将处理请求的特定控制器方法。有专门用于此的 HandlerMapping 和 HandlerAdapter。您可以在 M2 发布后的博文中更详细地了解这一点。

https://spring.io/blog/2011/06/13/spring-3-1-m2-spring-mvc-enhancements/

Spring 3.1 尚未正式发布。当然,它可以作为里程碑版本使用,也可以作为夜间快照使用。无论哪种方式,这是您应该考虑的,因此值得一提。

【讨论】:

  • 感谢您的回复。我们可能在 3.1 正式版之前无法升级,但请记住这一点。
【解决方案2】:

AOP 非常适合您。您应该能够编写一个执行您的任务的建议,并使用一个连接点定义来捕获被调用控制器的上下文 - 您拥有的任何自定义注释以及传递的参数。

【讨论】:

    【解决方案3】:

    由于HandlerMapping 不知道,您无法确定它将从拦截器内部实际调用的处理程序上的哪个方法。该逻辑全部隐藏在AnnotationMethodHandlerAdapter 中,它并没有真正的扩展点。如果您需要拦截器中的信息,您需要实现一种方法来确定它将根据您的控制器结构调用哪个方法。

    【讨论】:

      【解决方案4】:

      请发布代码示例,以便我们更好地了解您要解决的问题。

      鉴于您到目前为止所描述的内容,我认为这不是 HandlerInterceptor 的用途。它应该用于横切关注点,但很难从您的问题描述中分辨出什么是横切。如果你想把逻辑绑定到一个控制器上,那为什么不直接修改控制器呢?听起来修改无论如何都与控制器紧密耦合,但没有更多细节很难说。也就是说,这里有一个相关的问题和答案:HandlerMethod given a HttpRequest?

      使用 AOP 可以帮助您了解其中的一部分——至少您会知道更多关于调用哪个控制器方法的信息。更多信息:Spring AOP pointcut that matches annotation on interface

      【讨论】:

      • "为什么不直接修改控制器" -- 想法是将对控制器的修改限制为仅注释控制器方法。我看了另一个问题,它确实解决了我的担忧,遗憾的是它说“你不能那样做。”
      【解决方案5】:

      你看过反射吗?

      http://java.sun.com/developer/technicalArticles/ALT/Reflection/

      例如

          Class classVar = Class.forName("java.lang.String");
      
        // getDeclaredFields() returns all the constructors
        Constructor cnstArray[] = classVar.getConstructors();
      
        // getFields() returns the declared fields 
        Field fldArray[] = classVar.getDeclaredFields();
      
        // getMethods() returns the declared methods of the class.
        Method mtdArray[] = classVar.getMethods();
      

      【讨论】:

        【解决方案6】:

        我一直在寻找相同的解决方案,我发现教程 https://saarthakvats.wordpress.com/2016/05/29/spring-4-mvc-request-interceptor-and-custom-method-argument-annotation-resolver/comment-page-1/#comment-9 在其中创建处理程序和注释以在处理程序检查端点方法内的令牌是否正常后传递用户 ID。只需稍加修改,我们就可以将其转换为注释,以确定该端点是公共端点还是需要用户角色。

        另一个更接近我们需要的例子:https://www.future-processing.pl/blog/exploring-spring-boot-and-spring-security-custom-token-based-authentication-of-rest-services-with-spring-security-and-pinch-of-spring-java-configuration-and-spring-integration-testing/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-06
          • 2014-05-19
          • 2014-07-25
          相关资源
          最近更新 更多