我的@RequestMapping
类中的各种@Controller
方法都有我想在运行时分析的自定义注释。
E.g:
@Controller
@RequestMapping("/bla")
@RequireCommunityLevel("...")
@AnotherCustomAnnotation(value = "...")
public class FakeController {
// ...
@RequireScore(level = Score.Platinum, score = 8500)
@RequestMapping("/blabla")
@AnotherCustomAnnotation(value = "...")
public DTOResponse<MySpecialModel> getMySpecialModels() {
// ...
}
}
当我在自定义Interceptor
和Filter
课程中收到请求时,我想分析请求将要调用哪个Method
。
我过去曾使用基于Javax Servlet
和Jetty
的自定义框架,并经常实施某种可以查询的方法 - 注册表。
例如:
public class CustomFilter extends Filter {
@Inject
private MyMethodRegistry registry;
@Override
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// get the request path
final String path = getPath(request);
final Method m = this.registry.getMethodForPath(path);
// that's what I mean to do
if (m.getAnnotation(RequireScore.class) != null) { ... }
if (m.getDeclaringClass().getAnnotation(AnotherCustomAnnotation.class != null) { ... }
chain.doFilter(request, response);
}
}
我在Spring
中寻找类似的方法,可能是一个内置的实用程序,可以在运行时分析Annotation
方法上的@RequestMapping
。所有这些都应该在我的Interceptor / Filter中发生。
答案 0 :(得分:1)
正如@ M.Deinum在评论中建议您可以在Handler
中获取Interceptor
参数。
我还发现this tutorial可以解释我需要什么。
在HandlerInterceptor::preHandle
final HandlerMethod handlerMethod = (HandlerMethod) handler; // the last parameter
final Method method = handlerMethod.getMethod();
// check for annotations