Eclipse Spring安全ACL域错误:类型xxx已定义

Eclipse Spring安全ACL域错误:类型xxx已定义,eclipse,grails,spring-security,eclipse-plugin,Eclipse,Grails,Spring Security,Eclipse Plugin,我正在使用Eclipse、Grails2.4.5和。我使用以下命令创建了管理ACL数据的域类: s2-create-acl-domains 生成这些域之后,Eclipse报告已经定义了这些类 错误日志显示: 在我的BuildConfig.groovy中,我有: compile ":spring-security-core:2.0-RC5" runtime ':spring-security-acl:2.0-RC2' 有没有办法修复Eclipse不显示错误的问题?除此之外,代码运行正常。

我正在使用Eclipse、Grails2.4.5和。我使用以下命令创建了管理ACL数据的域类:

s2-create-acl-domains
生成这些域之后,Eclipse报告已经定义了这些类

错误日志显示:

在我的
BuildConfig.groovy
中,我有:

compile ":spring-security-core:2.0-RC5"
runtime ':spring-security-acl:2.0-RC2'
有没有办法修复Eclipse不显示错误的问题?除此之外,代码运行正常。

编辑:下面是由
grailss2创建acl域所生成的类。除了在
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
    }
}
acentry

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'
    }
}

编辑:我仍然没有解决这个问题的方法

我假设您已经安装了插件并正确配置了它

首先是一点背景知识。Java不能有使用相同名称引用的类。Eclipse通过groovy插件抱怨已经定义了名为
AclClass、acentry、AclObjectIndentity、AclSid
的类。当您没有定义这些类时,就会遇到挫折!groovy需要记住的是groovy基于脚本名隐式定义类。(有关更多信息,请参阅Steve Claridge的文章。)

由于您提到代码运行,我希望在groovy邮件列表上,Eclipse保留着一个不再存在的类引用。对他有效的解决方案是:

将类移动到单独的groovy类文件会导致错误移动 与班级一起;eclipse现在抱怨groovy中的类 类文件已定义

但是,我是这样解决问题的:

  • 从类文件中删除该类,然后保存该文件

  • 保存脚本文件(不带类),然后打开它并将类定义复制回,然后再次保存该文件

  • --埃里克·蒂凡尼

    这似乎重置了Eclipse在内存中保存的引用

    编辑


    该脚本将为您创建几个示例类,用于开始填写应用程序。尝试并遵循这些指示,看看是否抛出了相同的错误

    Groovy有两种处理.Groovy文件的方法:

    • 作为脚本:在这种情况下,您不能拥有与文件同名的类。您可以识别脚本文件,如果文件中的class语句(导入除外)之外有任何代码,则它是一个脚本
    • 作为类定义文件:当然,在Java中,类定义与文件同名
    脚本案例中发生的情况是,如果文件中有任何代码要执行,那么Groovy需要一个包含该代码的类。Groovy将使用文件名隐式创建一个包含类

    因此,如果您有一个名为AclEntry.groovy的文件,其中包含一些不在类定义中的代码,groovy将创建一个隐式包含类AclEntry。这意味着脚本文件AclEntry.groovy本身不能包含名为AclEntry的类,因为这将是一个重复的类定义,因此会出现错误

    另一方面,如果您在文件AclEntry.groovy中所做的只是定义类AclEntry(以及任意数量的其他类),那么groovy会将该文件视为类定义的简单集合,不会有隐式包含类,在类定义文件AclEntry.groovy中有一个名为AclEntry的类是没有问题的


    您可能需要检查groovy文件中是否存在这种情况。

    Eclipse的缓存中可能有旧文件

    您可以尝试以下操作:

    grails clean. 
    

    然后重新安装这些类。

    您可能需要使用grails命令刷新依赖项。

    我尝试过这样做。1.清洁工程,2。删除生成的域>grails.plugin.springsecurity.acl>。。。3.清洁项目。4.s2创建acl域这会导致相同的错误。我做错了什么。你可以发布一个我可以测试的样本项目吗?你的回答没有任何帮助。我阅读了spring安全和ACL手册。由于您的代码正在运行,我想知道Eclipse的配置方式是否有问题。你试过使用吗?他们有免费的社区版。community edition没有很多像Ultimate edition那样方便的Grails开发功能,但是您可以使用Grails命令行界面并从那里开始。我正在用groovy邮件列表中的某个人用来解决类似问题的解决方案更新我的答案。同样,不要发布指向我知道所有这些内容的文档的链接。使用s2快速启动并不是一个革命性的答案。拜托,我执行的唯一命令是
    grailss2创建acl域
    。我在编辑中发布了生成的类。请你看一下,告诉我应该做些什么来让它工作?看起来这只是一个eclipse问题,我会尝试的是1)删除eclipse的构建目录,看看是否有帮助;或者2)创建一个新项目,在eclipse中导入,并在该项目中复制groovy文件;eclipse不应该抱怨。我在Mac上使用GGTS。我在哪里可以找到构建目录?对于grails应用程序,您可以运行
    grails clean
    或删除
    target
    目录(在没有其他功能的情况下要做的事情!)我是否也应该删除target eclipse目录?