grails中两个动作签名之间的差异

时间:2014-02-18 07:34:03

标签: grails spring-security annotations closures grails-plugin

在Grails中,我们可以使用两种方式定义一个动作: -

def actionname()
{

}

def actionname = {

}

这两种风格有什么区别?当我试图在动作(第二种风格)上方插入一个弹簧安全注释时,它说"@Secured" not applicable to field。 这是什么意思?是因为关闭?

5 个答案:

答案 0 :(得分:5)

Grails参考文档7.The Web Layer提到在早期版本的Grails中使用闭包来控制器操作,现在首选使用方法。但是,两者都受到支持。它继续列出了使用方法的一些好处。

就个人而言,我在所有控制器中使用方法,并且还遇到了注释问题,例如 @Secured ,它只适用于方法,而不适用于闭包。

答案 1 :(得分:2)

在早期版本的Grails选项2(作为闭包的操作)是唯一受支持的样式。 Grails 2.x引入了actions-as-methods风格,现在这是推荐的方法,但仍然支持封闭样式以实现向后兼容性,如果您正在处理最初的应用程序(或插件),您将看到它写在Grails 1.x上。

答案 2 :(得分:0)

  1. 这是一种在Groovy中以最低级别定义具有上述结构的方法的方法。

  2. 第二种定义方式不是引用方法定义,而是以某种方式管理给定类或方法的闭包约束。就像它在域类中使用时一样。

  3. Example

        class Person {
        String name
        Person parent
        static belongsTo = [ supervisor: Person ]
    
        static mappedBy = [ supervisor: "none", parent: "none" ]
    
        static constraints = { supervisor nullable: true }
    
        //this allowed for methods only and why you got an error in above cases
        @override
        def toString(){
           return name.toString()
         } 
    }
    

    @Secured annotation accept list of roles (String[]) 它仅用于基于的方法定义 类中的toString()方法......我只是给你两个方案..

答案 3 :(得分:0)

第一个是具有未定义返回类型的常规方法定义。

第二个是对属性'actionname'的闭包的分配。

这就是您收到"@Secured" not applicable to field消息的原因,因为此注释仅适用于方法。

Shuttsy是正确的,第一种方式现在是在Grails中定义动作的优先方式。

答案 4 :(得分:0)

@Secured注释,因为Spring Security 2.0仅支持方法。因此,如果要为其应用安全注释,则必须将闭包转换为真实方法。了解更多@Secured Annotation