Spring Grails 3.0.11在控制器方法之前预处理commandObjects的AOP注释

Spring Grails 3.0.11在控制器方法之前预处理commandObjects的AOP注释,spring,grails,annotations,aop,Spring,Grails,Annotations,Aop,我试图使用注释和在方法之前执行的方面来检索grails控制器方法的参数。 方面处理程序执行正确,但我无法访问参数(实现了grails.validation.validatable)参数列表为空 实验 experiment.aspect.validatedspect conf.spring.resources controllers.experience.TestController 实验逻辑命令 我得到以下输出,这意味着方面处理程序方法在控制器方法之前运行,但它不获取参数 parameters

我试图使用注释和在方法之前执行的方面来检索grails控制器方法的参数。 方面处理程序执行正确,但我无法访问参数(实现了
grails.validation.validatable
)参数列表为空

实验

experiment.aspect.validatedspect

conf.spring.resources

controllers.experience.TestController

实验逻辑命令

我得到以下输出,这意味着方面处理程序方法在控制器方法之前运行,但它不获取参数

parameters []
Validated

你没有看到args,因为没有args

为了支持数据绑定并在servlet决定调用哪个控制器和方法时简化操作,AST转换为所有具有任何参数的操作方法创建了一个名称相同且没有参数的新方法。zero-arg方法是servlet最初调用的方法,它具有转换添加的逻辑以进行数据绑定调用。完成后,它将调用参数化方法,并将参数字符串转换为int/long/boolean/command objects/etc

no-arg方法还将使用
@grails.web.Action
commandObjects
属性中指定的arg类型进行注释。这将有助于找到另一个方法,但实际上很简单,因为如果声明重载的公共方法,将出现编译器错误


话虽如此,您可能不想使用这种方法,即使它确实有效——已有两种拦截控制器操作调用的标准方法,Grails过滤器(现在是3.x中的拦截器)和servlet过滤器。Grails过滤器和拦截器使得检查和选择性地添加、修改或删除请求参数变得非常简单,如果您在“before”调用中返回false,您将阻止Grails处理请求(例如,因为您自己呈现了请求,或发送了重定向等)

这是否意味着这两个方法都将被注释?我知道拦截器,它们很酷,但不是我想使用的。不,它用于标记可调用的操作-类型化方法实际上是非公开的很棒:(但这意味着,如果我想使用Arround注释记录操作的持续时间,我只会计算执行no arg方法的时间。不,你会将开始时间存储在拦截器的
之前
部分,并从
之后
部分的时间中减去。除非你为更多的com获得更多的报酬plex实现,然后在这个已解决的问题上尽你所能地工作:)在反编译Groovy方面做得很好(尽管Grails3.x中使用的Groovy版本中发生了一些变化,因为许多字节码不被理解,并且没有被解码)通常有助于阐明AST的效果。在2.5版本的应用程序中,只需一个简单的控制器和方法,您就能更清楚地看到它
package experiment.aspect


import grails.validation.ValidationException
import org.aspectj.lang.JoinPoint

import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before


/**
 * Created by Vaggelis on 10/13/2016.
 */
@Aspect
class ValidatedAspect {

    @Before("@annotation(experiment.aspect.Validated)")
    public void preValidate(JoinPoint point) throws ValidationException{

        println "parameters  ${point.getArgs()}"


    }
}
import experiment.aspect.ValidatedAspect

// Place your Spring DSL code here
beans = {
    validatedAspect(ValidatedAspect)
}
package experiment
import experiment.aspect.Validated
class TestController extends BaseController {
    static responseFormats = ['json']
    @Validated
    def login(LoginCommand loginCommand){
         println "Validated"
         ...
    }

}
package experiment

/**
 * Created by Vaggelis on 9/14/2016.
 */
import grails.validation.Validateable


class LoginCommand implements Validateable {
//    String id
    String name
    static constraints = {
        name blank: false
    }
}
parameters []
Validated