Grails 2.4.4过滤器中如何获取请求对应的Action/方法?
在Grails 2.4.4过滤器中获取Action方法并检查注解
我来帮你搞定这个需求!你已经配置了针对myController的过滤器,接下来只需要在before闭包里拿到对应的Action方法,再检查它的注解就能实现额外操作了,具体步骤如下:
1. 拿到目标Controller的类信息和Action方法
在过滤器的before块里,你可以借助grailsApplication获取Controller的元数据,再用内置的actionName变量拿到当前请求的Action名称,进而获取对应的Method对象:
class MyTestFilters { def grailsApplication def filters = { testFilter(controller:'myController', action:'*') { before = { // 获取目标Controller的GrailsClass(记得替换成你实际的包名和类名) GrailsClass controllerClass = grailsApplication.getControllerClass('com.yourteam.MyController') // 要是不想写死类名,也可以用逻辑名动态获取: // GrailsClass controllerClass = grailsApplication.getArtefactByLogicalPropertyName('Controller', controllerName) // 获取当前Action对应的Method(默认Action无参,要是有参数就把空数组换成对应参数类型) Method actionMethod = controllerClass.clazz.getDeclaredMethod(actionName, *[] as Class[]) } } } }
这里要注意,如果你用getArtefactByLogicalPropertyName,第二个参数传controllerName就行,它是过滤器内置的变量,不用自己从params里取。
2. 检查Action方法是否包含目标注解
拿到actionMethod之后,用Java反射API就能轻松检查注解了。假设你的自定义注解是@MyCustomAnnotation,代码可以这么写:
// 先引入你的注解类 import com.yourteam.MyCustomAnnotation // 在before闭包里继续添加: if (actionMethod.isAnnotationPresent(MyCustomAnnotation)) { // 这里写你要执行的额外操作 println "当前Action ${actionName}带了自定义注解,触发额外逻辑" // 比如给request加属性、校验权限、修改响应头等 }
另外要确保你的注解设置了运行时可见,不然反射拿不到:
import java.lang.annotation.Retention import java.lang.annotation.RetentionPolicy @Retention(RetentionPolicy.RUNTIME) @interface MyCustomAnnotation { // 可以加注解属性,比如value()之类的 }
3. 处理边界情况,避免报错
有些Action可能是从父类继承来的,或者存在动态生成的情况,所以最好加个异常捕获,防止找不到方法报错:
try { Method actionMethod = controllerClass.clazz.getDeclaredMethod(actionName, *[] as Class[]) checkAnnotationAndDoAction(actionMethod) } catch (NoSuchMethodException e) { // 尝试从父类获取方法 try { Method actionMethod = controllerClass.clazz.getMethod(actionName, *[] as Class[]) checkAnnotationAndDoAction(actionMethod) } catch (Exception ex) { log.error("获取Action方法失败", ex) } } // 把检查注解的逻辑抽成方法,代码更整洁 private void checkAnnotationAndDoAction(Method actionMethod) { if (actionMethod.isAnnotationPresent(MyCustomAnnotation)) { // 执行额外操作 } }
这样就完美实现你要的功能啦——在过滤器里精准识别带特定注解的Action,然后执行对应的额外逻辑。
内容的提问来源于stack exchange,提问作者Spark323
相关产品推荐
相关产品推荐

