Spring Security ACL Domains Error:已定义xxx类型

时间:2015-07-23 11:20:44

标签: eclipse grails spring-security eclipse-plugin

我正在使用Eclipse,Grails 2.4.5和Spring Security ACL plugin。我使用以下命令创建了管理ACL数据的域类:

s2-create-acl-domains

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

enter image description here

错误日志显示:

enter image description here

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

编辑:我仍然无法解决此问题!!!

4 个答案:

答案 0 :(得分:3)

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

  • 作为脚本:在这种情况下,您不能拥有与文件同名的类。您可以识别脚本文件,如果文件中的类语句之外有任何代码(除了导入),则它是一个脚本
  • 作为类定义文件:当然,在Java中,您将使用与文件同名的类定义。

脚本中发生的情况是,如果要在文件中执行任何代码,那么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现在抱怨那个时髦的班级   类文件已经定义。

     

然而,我解决了这个问题:

     
      
  1. 从类文件中删除该类,然后保存该文件。

  2.   
  3. 保存脚本文件(没有该类),然后打开它将类定义复制回来,然后再次保存文件。

  4.         

    - 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.