2013-12-15 8 views
6

ich die Feder Sicherheits-App von th grails Seite installiert haben Plugin nach grails s2-quickstart com.testApplication.secureApplication User Role läuft die Domain-Objekt I grails run-app tat automatisch generieren und bekam diese Ausnahme:Grails 2 - Kann nicht Frühling Sicherheitsdomäne Objekt erstellen

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

Die Sache ist Meine Datenbank ist korrekt konfiguriert, weil ich die Tabelle role und user_role bekomme. Allerdings wird der Benutzer in meinem postgresql db nicht generiert. Meine Umsetzung meiner automatisch generierte user domain object sieht wie folgt aus:

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

Ich schätze Ihre Antwort!

Antwort

8

'Benutzer' ist ein reservierter Name in Postgres. Sie können dies vermeiden, indem Sie in Ihrer Domänenklasse ein Mapping einrichten und einen alternativen Namen verwenden.

static mapping = { table 'myusers' } 

Auf diese Weise bleibt Ihre Domain-Klasse gleich. Sie könnten den Namen auch ähnlich wie mit "Passwort" umgehen.

+0

hätte nie Gedanken von 'user' ist ein Stichwort zu finden, danke! –

0

Fügen Sie in der Benutzerdomäne die folgende Zuordnungskonfiguration hinzu, damit der Domänen-/Tabellenname user ähnlich wie password Spalte übersprungen wird.

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

Ein Blog-Post, die das Problem und die Lösung erklärt kann here

+0

Versucht diese Lösung. Es ist über das erste Problem hinausgekommen, aber dann erzeugt es ein neues Problem mit der Sequenzbenennung: spi.SqlExceptionHelper FEHLER: Beziehung "seq_" Benutzer "" existiert nicht Ich denke, es ist besser, eine Tabelle zu vermeiden, die "Benutzer" in postgres genannt wird. –

+0

@EdJ Ich habe keine Sequenznamen verwendet und dieses Problem wurde nicht angezeigt. Wie Sie gesagt haben, wenn Sie eine Tabelle namens 'Benutzer' vermeiden können, ist das gut, aber ich möchte diesen Namen behalten. –