首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >域错误: xxx类型已经定义

域错误: xxx类型已经定义
EN

Stack Overflow用户
提问于 2015-07-23 11:20:44
回答 4查看 566关注 0票数 3

我使用的是Eclipse、Grails2.4.5和弹簧安全ACL插件。我使用以下命令创建了管理ACL数据的域类:

代码语言:javascript
复制
s2-create-acl-domains

在生成这些域之后,Eclipse报告已经定义了类。

错误日志显示:

在我的BuildConfig.groovy中有:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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'
    }
}

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

EN

回答 4

Stack Overflow用户

发布于 2015-07-31 14:03:30

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

  • 作为脚本:在本例中,您不能拥有与文件同名的类。您可以识别脚本文件,如果文件中的类语句之外有任何代码(导入除外),那么它就是一个脚本。
  • 作为类定义文件:当然,就像在中一样,类定义与文件的名称相同。

在脚本中所发生的情况是,如果要在文件中执行任何代码,那么Groovy需要一个包含该代码的类。Groovy将隐式地创建一个包含文件名的类。

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2015-07-31 14:50:07

Eclipse的缓存中可能有旧文件。

您可以尝试以下方法:

代码语言:javascript
复制
grails clean. 

然后重新安装类。

票数 1
EN

Stack Overflow用户

发布于 2015-07-27 15:00:28

我假设您已经安装了Grails弹簧安全核心插件并正确配置了该插件。

首先介绍一下背景。Java不能有使用相同名称引用的类。Eclipse通过groovy插件抱怨已经定义了名称为AclClass, AclEntry, AclObjectIndentity, AclSid的类。当您没有定义这些类时,您就会感到沮丧!groovy要记住的是,groovy基于脚本名隐式定义类。(有关更多信息,请参阅Steve的写得快。)

由于您提到代码运行,所以我预计groovy邮件列表上的就像这个用户将保留一个不再存在的类引用。对他有效的解决办法是:

将类移动到单独的groovy类文件使错误与类一起移动;eclipse现在抱怨已经定义了groovy类文件中的类。 然而,我这样解决了问题:

  1. 从类文件中删除类,并保存该文件。
  2. 保存脚本文件(没有类),然后打开它,将类定义复制回其中,然后再次保存该文件。

-埃里克·蒂芙尼

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

编辑

这里有一个与grails一起使用Spring安全性的不同教程。脚本将为您创建几个示例类,以便开始填写应用程序。试着按照这些指示,看看是否抛出了相同的错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31585864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档