2013-12-15 17 views
6

Ho installato l'applicazione di sicurezza a molla da esimo graal plug pagina dopo l'esecuzione grails s2-quickstart com.testApplication.secureApplication User Role per autogenerare l'oggetto di dominio che ho fatto grails run-app e ottenuto questa eccezione:Grails 2 - Non è possibile creare l'oggetto dominio di sicurezza primavera

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

La cosa è il mio database è configurato correttamente, perché ottengo la tabella role e user_role. Tuttavia l'utente non viene generato nel mio postgresql db. La mia realizzazione del mio autogenerata user domain object sembra che:

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

Apprezzo la tua risposta!

risposta

8

"utente" è un nome riservato in Postgres. Puoi evitarlo impostando una mappatura nella tua classe di dominio e usando un nome alternativo.

static mapping = { table 'myusers' } 

In questo modo la classe del dominio rimane la stessa. Puoi anche sfuggire al nome in modo simile a come hai fatto con 'password'.

+0

avrei mai di pensiero di 'user' essere una parola chiave, grazie! –

0

Nel dominio utente, aggiungere la seguente configurazione di mappatura per mantenere il nome di dominio/tabella user simile alla colonna di modo password ignorata.

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

un post sul blog che spiega il problema e la soluzione può essere trovata here

+0

Provato questa soluzione. Ha superato il primo problema, ma poi genera un nuovo problema con la denominazione della sequenza: spi.SqlExceptionHelper ERRORE: la relazione "seq_" utente "" non esiste Penso che sia meglio evitare una tabella denominata 'utente' in postgres. –

+0

@EdJ Non ho usato alcun nome di sequenza e non ho visto questo problema. Come hai detto, se puoi evitare una tabella denominata 'utente', va bene, ma mi piace mantenere questo nome. –

Problemi correlati