Mensagens de erros do Grails como sobreescrever
27/09/2016 19:40
0
Boa noite pessoal, tudo certo ?
Seguinte, estou com problemas para criar mensagen de erros para as validações que fiz em minhas Domain Class, com por exemplo, esta abaixo :

?package ordemservico.api

import groovy.transform.EqualsAndHashCode

@EqualsAndHashCode(includes = 'id')
class Status {

String descricao

static hasMany = [listaSubStatus : SubStatus]

static constraints = {
descricao nullable: false, blank: false, minSize: 1, maxSize: 50
}

static mapping = {
table "STA_STATUS"
id column: "STA_CODIGO", sqlType: "SERIAL"
descricao column: "STA_DESCRICAO", sqlType: "VARCHAR(50)"
version false
listaSubStatus joinTable: [name: "SSU_STATUSSUBSTATUS", key:"STA_CODIGO", column:"SUS_CODIGO" ]
}
}


segundo a documentação (http://docs.grails.org/latest/ref/Constraints/maxSize.html) se eu quero criar uma mensagem personalizada para o validador "maxsize" preciso seguir este modelo:

className.propertyName.maxSize.exceeded

já tentei de várias formas:

- ordemservico.api.Status.descricao.max.Size.exceeded
- Status.descricao.max.Size.exceeded
- ordemservico.api.Status.descricao.max.Size.exceeded.message
- Status.descricao.max.Size.exceeded.message

porém continuo recebendo a mensagem padrão do "messages.properties", existe mais alguma configuração que preciso mexer para eu pegar a mensagem no seguinte trecho de código:

status.errors.allErrors.each {
println it.getDefaultMessage()
}

agradeço desde já pela ajuda
Tags: Grails; DomainClass; messages.properties


0
Só complementando estou usando Grails 3.1.12


0
Basta debugar e analisar dentro do atributo "errors" presente na sua classe de dominio. Nesse atributo possui uma lista de erros e em cada um existe um atributo "codes" com vários tipos de identificadores possíveis para a sobrecarga de mensagens. Ou seja, ele vai procurar todos os codes que constarem ali, se não achar nenhum destes vai utilizar o default.

Obs: acredito que "descricao.invalid.max.size.message" serviria para você.


0
Eu cheguei a ver essa lista que você mencionou, cheguei até a copiar todos os valores e testar, não funcionou será que estou tentando pegar a mensagem pela propriedade errada ?

?status.errors.allErrors.each {
println it.getDefaultMessage()
}


essa configuração é case sensitive ? preciso colocar o package de minha domain class ?


1
Você está incluindo a mensagem no arquivo "messages_pt_BR.properties" ???

Ex:
descricao.invalid.max.size.message=Texto da mensagem

Que configuração é essa que você está mencionando? Para que você está usando um println na mensagem de erro?  Porque não usa apenas isso na controller:
respond status.errors, view:'retorno.gsp'

Para capturar a mensagem manualmente você pode tentar definir na sua controller:
def messageSource

e trocar o "println it.getDefaultMessage()" por "messageSource.getMessage( it, Locale.getDefault() )


0
Então a minha aplicação vai ser uma API que pode ser consumida por uma aplicação angularjs, por exemplo, e resolvi padronizar os retornos dela, ela sempre irá retornar um json que tem 2 propriedades, uma é uma lista de mensagens que retorna os erros de validação e exceções que aconteceram na operação solicitada, a outra propriedade é uma lista de objetos que retorna o objeto que foi cadastrado/atualizado e no select os objetos que atendam a requisição do cliente.
Eu já realizo validação na minha app cliente no angularjs, porém gostaria de aplicar as validações no servidor também.
Eu cheguei a utilizar o messageSource para pegar as mensagens, mas achei que teria como pegar diretamente da lista de erros do objeto por isso resolvi perguntar por aqui


0
Boa tarde, José Luiz.

O padrão de chave mencionado na documentação oficial é o correto e segue o padrão camelCase. Portanto, sua chave deve ficar da seguinte maneira:

status.descricao.maxSize.exceeded

onde:
status: Nome da classeno padrão camelCase (sempre iniciando com letra minúscula, independente do nome da sua classe);
descricao: Nome da propriedade da sua classe, também no formato camelCase;
maxSize: Tipo da validação;
exceeded: Erro;

No código que você apresentou, as mensagens não funcionam porque não seguem esse padrão. A que passou mais perto foi a Status.descricao.max.Size.exceeded, mas ela foge do padrão no nome da classe (deveria ser status, e não Status) e no tipo de validação (o correto é maxSize, e não max.Size).
04/10/2016 14:23


0
boa tarde pessoal.
Agradeço pela colaboração de todos, para resolver meu problema eu vou utilizar a dica de nosso colega Victor Glacomo Soares e injetar um "messageSource" no ponto que preciso para pegar as mensagens,isso já vai me atender bem, porém as mensagens quando tem caracter especial ou acentuação estão com problemas no charset como posso corrigir isso ?


1
Tenta mudar o encoding do arquivo de mensagem e do arquivo da controller para UTF-8


0
Deu certinho aqui o encode.
Muito obrigado pela ajuda de todos



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto