我有一个自定义注释,我在控制器中注释了一个方法和@ReqestMapping。
目标是使用HandlerInterceptor中自定义注释中设置的值来执行任务。
我有拦截器(HandlerInterceptorAdaptor)映射并执行。如果我在具体的Interceptor中设置断点,我可以检查HttpServletRequest,HttpServletResponse和handler objects。但是,我看不到如何1,获取请求尝试访问的方法2,获取该方法的注释和3,当然,获取注释设置的值。
有人能指出我这方面的好文件吗?
请和谢谢。
答案 0 :(得分:4)
AOP将非常适合您。您应该能够编写一个执行任务的建议,并使用连接点定义捕获被调用控制器的上下文 - 您拥有的任何自定义注释以及传递的参数。
答案 1 :(得分:4)
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。只需稍作修改,我们就可以将其变成注释,以确定该端点是公共端点还是需要用户角色。