在拦截器上使用Spring MVC控制器方法上的自定义注释

时间:2011-06-23 23:00:52

标签: java model-view-controller spring annotations

我有一个自定义注释,我在控制器中注释了一个方法和@ReqestMapping。

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

我有拦截器(HandlerInterceptorAdaptor)映射并执行。如果我在具体的Interceptor中设置断点,我可以检查HttpServletRequest,HttpServletResponse和handler objects。但是,我看不到如何1,获取请求尝试访问的方法2,获取该方法的注释和3,当然,获取注释设置的值。

有人能指出我这方面的好文件吗?

请和谢谢。

6 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

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

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

使用AOP可以让你在那里的一部分 - 至少你会知道更多关于调用哪个控制器方法。更多信息:Spring AOP pointcut that matches annotation on interface

答案 3 :(得分:1)

由于HandlerMapping不知道,你无法分辨它将在拦截器内实际调用的处理程序上的哪个方法。这个逻辑都被埋没在AnnotationMethodHandlerAdapter里面,它没有真正的扩展点。如果你需要拦截器中的信息,你需要实现一种方法来确定它将根据你的控制器结构调用哪种方法。

答案 4 :(得分:0)

你看过倒影吗?

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();

答案 5 :(得分:0)

我一直在寻找相同的解决方案,但我发现教程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/