sábado, 21 de fevereiro de 2009

Grails: problema com a tag g:actionSubmit

Para quem tiver problemas com a tag g:actionSubmit, que deverá estar dentro de uma tag g:form, além de declarar o "action" na tag "g:form", declare tambem em actionSubmit, como no exemplo abaixo:

   ...
   
   ...

AcegiSecurity Plugin para o Grails com BD Postgresql

O problema:

Hoje tive um problema ao utilizar o plugin AcegiSecurity no Grails com o banco de dados Postgresql.
O AcegiSecurity é o framework de segurança do Spring.

Seguindo os passos descritos em Basic Tutorial using Requestmap tudo ocorreu bem enquanto eu estava utilizando o banco de dados HSQLDB, mas quando coloquei a aplicação em produção no PostgreSql, meus problemas começaram...

Ao iniciar a aplicação eu obtinha um erro. Analisando o stacktrace, percebi que o erro era gerado pela linha n. 9 do meu BootStrap. Nessa linha, eu estava criando e salvando no banco de dados um usuário default administrador.

A primeira coisa que fiz foi abrir o pgAdmin (PostgreSQL admin) para ver a tabela User e para minha surpresa ela não havia sido criada.

A solução:

Para ver porque a tabela não estava sendo criada fiz as seguintes alterações:
  • no arquivo conf/Config.groovy:

alterei a linha: rootLogger="error,stdout" para: rootLogger="error,stacktraceLog" (onde stacktraceLog é meu appender para um arquivo de log)

configurei codehaus.groovy.grails.orm.hibernate para "debug"

configurei hibernate="on"
  • no BootStrap comentei a linha que tentava criar um novo usuário para não poluir muito o arquivo de log.

Rodei a aplicação novamente e procurei por "create table user" no arquivo de log. O erro estava logo abaixo:

[1953] hbm2ddl.SchemaExport Unsuccessful: create table user.... [1953] hbm2ddl.SchemaExport ERROR: syntax error at or near "user"

Isso ocorreu pois "user" é uma palavra reservada no PostgreSQL.

Para resolver o problema no passo "Create the User, Role, and Requestmap domain classes" em Basic Tutorial using Requestmap deixe que ele gere os nomes padrões das classes de domínio, que serão Person, Authority e Requestmap. Para isso use apenas o comando:

grails create-auth-domains