Erro no Validation Bean com arquivo .properties - Capítulo 11.10 apostila Caelum fj21

Boa tarde pessoal,

Estou tentando usar um arquivo .properties para personalizar o texto quando um campo é deixado como null, conforme explicado no capítulo 11.10 da fj21 da Caelum.
Porém, quando clico no botão que envia o form, é inserido o valor null no banco mesmo assim.

Meu spring-context.xml (declaração do arquivo mensagens.properties, que fica em WEB-INF):

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename" value="/WEB-INF/mensagens" /> </bean>

Meu Bean (Tarefa):

[code]package br.com.caelum.tarefas.model;

import java.util.Calendar;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class Tarefa {

private Long id;

@NotNull(message="{tarefa.descricao.vazia}")
private String descricao;
private boolean finalizado;
private Calendar dataFinalização;

public Tarefa() {
	
}

public Long getId() {
	return id;
}
public void setId(Long id) {
	this.id = id;
}
public String getDescricao() {
	return descricao;
}
public void setDescricao(String descricao) {
	this.descricao = descricao;
}
public boolean isFinalizado() {
	return finalizado;
}
public void setFinalizado(boolean finalizado) {
	this.finalizado = finalizado;
}
public Calendar getDataFinalização() {
	return dataFinalização;
}
public void setDataFinalização(Calendar dataFinalização) {
	this.dataFinalização = dataFinalização;
}

}
[/code]

O arquivo mensagens.properties (localizado na pasta WEB-INF):

tarefa.descricao.vazia=Descrição deve ser preenchida! tarefa.adicionada.com.sucesso=Tarefa adicionada com sucesso!

E o Formulario html (que usa a taglib do spring, que deveria mostrar o texto do mensagens.properties caso o campo descricao fosse deixado vazio):

[code]<%@taglib uri=“http://www.springframework.org/tags/form” prefix=“form” %>

Adicionar tarefas

Descrição:



[/code]

Não há mensagem de erro algum, mas como o atributo descricao do Bean Tarefa tá com a anotação @NotNull, não era pra ele tá inserindo no banco de dados com o valor null.

Se alguem puder dar uma ajuda, agradeço muito.

Grande abraço a todos.

Já tentou colocar uma mensagem qualquer?
Por exemplo:

@NotNull(message="Campo não pode ser deixado em branco")

[]s

Olá valmorpe, primeiramente, muito obrigado pela atenção e ajuda.

Sim, já tentei.

Mas mudei de @NotNull para @NotEmpty do Hibernate aqui e deu certo, só que tive que fazer o que você indicou:

@NotEmpty(message="Campo descrição não pode ser deixado em branco") private String descricao;

Nesse caso eu teria que colocar as String juntamente com o Bean. Isso é uma má prática de programação? Seria melhor isolar essas mensagens em outro arquivo (no mensagens.properties), ou deixar assim mesmo?

Muito obrigado, abraços.

Sem contar que eu queria validar com o spring, e só consegui com o hibernate.

Tenta colocar o nome da chave do properties sem chaves.

Olá lele_vader,

Muito obrigado por ajudar aqui.

Então, fiz o que você indicou agora, e também não deu certo. O estranho é que tá dando como se realmente a String descricao não estivesse vazia, porque ele envia o form e insere o valor null pra banco, só funcionando com o @NotEmpty do hibernate.

Dúvida ainda não resolvida, mas muito obrigado pelo tempo e disposição em ajudar, se tiver mais dicas, agradeço muito.

Abração.

A parte do not null resolvi assim:

@NotNull @Size(min=1, max=40, message="O campo descrição deve ter entre 1 e 40 caracteres")

Parece que o html passa uma String com “” pro servlet, ou seja, na realidade não é nula.

Porém, ainda não consigo ler o valor do mensagens.properties pra passar pro message do @Size.

Abraços.

Eu não sei como é no spring, mas geralmente os campos não preenchidos são injetados como vazio e não nulo, por isso talvez não entre na validação. Tanto que no jsf você pode incluir uma propriedade para transformar campos de string varias em nulo para ser pego na validação,pois @notEmpty é somente do hibernate e se você mudar de provider não vai funcionar.

Então, tô tentando resolver isso faz dois dias, já. Até perdi a conta de quantos tutoriais li ou quantos foruns visitei pra descobrir qual o problema, e até agora nada.

Quem puder dar um help, ficarei muito agradecido.

O problema é como passar o texto do mensagens.properties aqui:

@NotNull @Size(min=1, max=40, message="{tarefa.descricao.vazia}") private String descricao;

O mensagens.properties tá em WEB-INF (e especifico ele no meu spring-context.xml) assim:

tarefa.descricao.vazia=O campo descrição deve ter entre e caracteres

A saída que tenho é a String “{tarefa.descricao.vazia}” no meu html.

Caso eu não tenha sido muito claro, é só dizer que tento explicar melhor.

Se alguem souber como resolver, ficarei muito grato.

Abraços.

Onde você configurou o seu arquivo de propriedades ?

Estou com a mesma dúvida!!!

Pois é. Sei que passaram-se alguns dias, mas estava estudando o Spring e caí no mesmo problema. Visitei 200 sites e nada. Tento utilizar o bean validation em descriçao impedindo de persistir vázio, mesmo assim vai vazio não me mostrando na tela uma mensagem de obrigatoriedade de preenchimento do campo, que deveria ser regra. Se alguém resolveu favor postar para me ajudar e aos demais que vierem a ter o mesmo problema.

Fiz um teste aqui somente com Validation Bean e vi que as mensagens default estão no arquivo ValidationMessages.properties sobescreva este arquivo outro com mesmo nome nos seus resources.

Estou na mema sinuca que vocês, mesmo tendo o arquivo ValidationMessages.properties dentro do resources não exibe a mensagem apenas a string dentro dos {}.

Quem resolver posta ai vai ajudar a galera no futuro.

Olá! A configuração do Spring é para arquivo messages.properties e só funciona com fmt.

Você precisa criar o arquivo ValidationMessages.properties dentro da pasta SRC.
Nela você pode configurar sua mensagem

@NotNull(message="{tarefa.descricao.vazia}")

ValidatonMessages.properties

tarefa.descricao.vazia = bla bla bla

Abraço!

Olá pessoal…

Ressuscitando este tópico mas com um pequeno “plus”.

Usando SPRING com JSF e PRIMEFACES, róla o seguinte problemex.

Usando o mesmo exemplo do cótigo abaixo:

@NotNull(message="{tarefa.descricao.vazia}")

Se uso o validateClient=“true” do commandButton do Primefaces, a validação é feita, mas a mensagem exibida é a {tarefa.descricao.vazia}, ou seja, busca direto do Bean.

E se uso a opção “ajax=“false””, funciona como o desejado.

Valeu!