我正在使用Eclipse,Grails 2.4.5和Spring Security ACL plugin。我使用以下命令创建了管理ACL数据的域类:
s2-create-acl-domains
在生成这些域之后,Eclipse报告已经定义了类。
错误日志显示:
在BuildConfig.groovy
我有:
compile ":spring-security-core:2.0-RC5"
runtime ':spring-security-acl:2.0-RC2'
有没有办法解决这个问题,Eclipse没有显示错误?除了那个错误,代码运行正常。
编辑:以下是grails s2-create-acl-domains
生成的类。除了在AclObjectIdentity
objectId类型中,我没有更改任何内容,从Long到String。
以下是已生成的类:
AclClass
:
package grails.plugin.springsecurity.acl
class AclClass {
String className
@Override
String toString() {
"AclClass id $id, className $className"
}
static mapping = {
className column: 'class'
version false
}
static constraints = {
className unique: true, blank: false
}
}
AclObjectIdentity
:
package grails.plugin.springsecurity.acl
class AclObjectIdentity extends AbstractAclObjectIdentity {
String objectId
@Override
String toString() {
"AclObjectIdentity id $id, aclClass $aclClass.className, " +
"objectId $objectId, entriesInheriting $entriesInheriting"
}
static mapping = {
version false
aclClass column: 'object_id_class'
owner column: 'owner_sid'
parent column: 'parent_object'
objectId column: 'object_id_identity'
}
static constraints = {
objectId unique: 'aclClass'
}
}
AclSid
:
package grails.plugin.springsecurity.acl
class AclSid {
String sid
boolean principal
@Override
String toString() {
"AclSid id $id, sid $sid, principal $principal"
}
static mapping = {
version false
}
static constraints = {
principal unique: 'sid'
sid blank: false, size: 1..255
}
}
AclEntry
:
package grails.plugin.springsecurity.acl
class AclEntry {
AclObjectIdentity aclObjectIdentity
int aceOrder
AclSid sid
int mask
boolean granting
boolean auditSuccess
boolean auditFailure
@Override
String toString() {
"AclEntry id $id, aceOrder $aceOrder, mask $mask, granting $granting, " +
"aclObjectIdentity $aclObjectIdentity"
}
static mapping = {
version false
sid column: 'sid'
aclObjectIdentity column: 'acl_object_identity'
}
static constraints = {
aceOrder unique: 'aclObjectIdentity'
}
}
编辑:我仍然无法解决此问题!!!
答案 0 :(得分:3)
Groovy有两种处理.groovy文件的方法:
脚本中发生的情况是,如果要在文件中执行任何代码,那么Groovy需要包含该代码的类。 Groovy将隐式创建一个包含文件名的包含类。
因此,如果您有一个名为AclEntry.groovy的文件,其中包含一些不在类定义中的代码,Groovy将创建一个名为AclEntry的隐式包含类。这意味着脚本文件AclEntry.groovy本身不能包含一个名为AclEntry的类,因为这将是一个重复的类定义,因此是错误。
另一方面,如果你在文件AclEntry.groovy中所做的只是定义类AclEntry(以及任意数量的其他类),那么Groovy会将该文件视为一个类定义的集合,将会有没有隐式包含类,并且在类定义文件AclEntry.groovy中有一个名为AclEntry的类没有问题。
您可能想要检查groovy文件中是否存在这种情况。
答案 1 :(得分:1)
Eclipse可能在缓存中有旧文件。
您可以尝试以下操作:
grails clean.
然后重新安装这些类。
答案 2 :(得分:0)
我正在假设您已安装Grails Spring Security Core插件并正确配置。
首先是一些背景知识。 Java不能包含使用相同名称引用的类。 Eclipse通过groovy插件抱怨已经定义了名为public static RequestCloner<HttpPost> forPostRequest(String URL) {
return new PostRequestCloner(URL);
}
的类。当你没有定义那些类时,会感到沮丧!使用groovy要记住的事情是groovy隐式定义基于脚本名称的类。 (有关更多信息,请参阅Steve Claridge的quick write up。)
由于你提到代码运行我期望在groovy邮件列表上like this user,Eclipse正在保留一个不再存在的类引用。对他有用的解决方案是:
将类移动到单独的groovy类文件会导致错误移动 与班级; eclipse现在抱怨那个时髦的班级 类文件已经定义。
然而,我解决了这个问题:
从类文件中删除该类,然后保存该文件。
- 醇>
保存脚本文件(没有该类),然后打开它将类定义复制回来,然后再次保存文件。
- Eric Tiffany
这似乎重置了Eclipse在内存中保存的引用。
修改强>:
Here is a different tutorial for using Spring security with grails.该脚本将为您创建一些示例类,以便您开始填写应用程序。尝试并按照这些说明查看是否抛出相同的错误。
答案 3 :(得分:0)
You may need to refresh dependencies using grails refresh-dependencies command.