Grails 2 - 无法创建spring安全域对象

Ann*_*lee 7 postgresql grails spring grails-2.0

我在运行grails s2-quickstart com.testApplication.secureApplication User Role后自动生成我所做的域对象时grails run-app,从grails插件页面安装了spring security app,并得到了以下异常:

|Loading Grails 2.3.4
|Configuring classpath
.
|Environment set to development
.................................
|Packaging Grails application
Precompiling AST Transformations ...
src C:\Users\GrailsWorkspace\testApplication\target\work\plugins\postgresql-extensions-0.6.1 C:\Users\GrailsWorkspace\testApplication\target\classes
Done precompiling AST Transformations!
..
|Compiling 3 source files
...................................................
|Running Grails application
Configuring Spring Security Core ...
... finished configuring Spring Security Core
Error |
2013-12-15 15:42:45,635 [localhost-startStop-1] ERROR hbm2ddl.SchemaExport  - Unsuccessful: create table user (id int8 not null, version int8 not null, account_expired bool not null, account_locked bool not null, enabled bool not null, "password" varchar(255) not null, password_expired bool not null, username varchar(255) not null unique, primary key (id))
Error |
2013-12-15 15:42:45,638 [localhost-startStop-1] ERROR hbm2ddl.SchemaExport  - ERROR: syntax error at "user"
  Position: 14
Error |
2013-12-15 15:42:45,688 [localhost-startStop-1] ERROR hbm2ddl.SchemaExport  - Unsuccessful: alter table user_role add constraint FK143BF46A1E03E05D foreign key (user_id) references user
Error |
2013-12-15 15:42:45,688 [localhost-startStop-1] ERROR hbm2ddl.SchemaExport  - ERROR: syntax error at "user"
  Position: 90
|Server running. 
Run Code Online (Sandbox Code Playgroud)

事情是我的数据库配置正确,因为我得到了表roleuser_role.但是用户没有在我的生成中生成postgresql db.我的自动生成的实现user domain object看起来像这样:

class User {

    transient springSecurityService

    String username
    String password
    boolean enabled = true
    boolean accountExpired
    boolean accountLocked
    boolean passwordExpired

    static transients = ['springSecurityService']

    static constraints = {
        username blank: false, unique: true
        password blank: false
    }

    static mapping = {
        password column: '`password`'
    }

    Set<Role> getAuthorities() {
        UserRole.findAllByUser(this).collect { it.role } as Set
    }

    def beforeInsert() {
        encodePassword()
    }

    def beforeUpdate() {
        if (isDirty('password')) {
            encodePassword()
        }
    }

    protected void encodePassword() {
        password = springSecurityService.encodePassword(password)
    }
}
Run Code Online (Sandbox Code Playgroud)

我感谢你的回答!

Jos*_*ore 9

'user'是Postgres中的保留名称.您可以通过在域类中设置映射并使用备用名称来避免这种情况.

 static mapping = { table 'myusers' }
Run Code Online (Sandbox Code Playgroud)

这样您的域类保持不变.您也可以使用类似于"密码"的方式来逃避名称.