在Grails中,我们可以使用两种方式定义一个动作: -
def actionname()
{
}
和
def actionname = {
}
这两种风格有什么区别?当我试图在动作(第二种风格)上方插入一个弹簧安全注释时,它说"@Secured" not applicable to field
。
这是什么意思?是因为关闭?
答案 0 :(得分:5)
Grails参考文档7.The Web Layer提到在早期版本的Grails中使用闭包来控制器操作,现在首选使用方法。但是,两者都受到支持。它继续列出了使用方法的一些好处。
就个人而言,我在所有控制器中使用方法,并且还遇到了注释问题,例如 @Secured ,它只适用于方法,而不适用于闭包。
答案 1 :(得分:2)
在早期版本的Grails选项2(作为闭包的操作)是唯一受支持的样式。 Grails 2.x引入了actions-as-methods风格,现在这是推荐的方法,但仍然支持封闭样式以实现向后兼容性,如果您正在处理最初的应用程序(或插件),您将看到它写在Grails 1.x上。
答案 2 :(得分:0)
这是一种在Groovy中以最低级别定义具有上述结构的方法的方法。
第二种定义方式不是引用方法定义,而是以某种方式管理给定类或方法的闭包约束。就像它在域类中使用时一样。
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。