Validator VRaptor FJ-28 ñ funciona bem!

Olá caros amigos,
estou fazendo a apostila fj28 - VRaptor e estou na parte aonde ensina a utilizar o validator do Hibernate.
Eu tenho 3 dúvidas a postar aqui que ñ me funciona

eu utilizei as anotações do hibernate na classe Produto nos seguintes atributos:

	@Length(max=40, message="descricao ñ pode ultrapasar 40 caracteres")
	@NotEmpty(message="Descrição precisa ser preenchido") 
	private String descricao="";
    
	@NotNull(message="Preço precisa ser preenchido")
	@Min(value = 0, message="preço tem que ser um valor maior que 0")
	private Double preco;

sendo que quando eu vou editar algum produto por exemplo no campo descrição eu notei que ele já cria automaticamente sempre no campo descrição 2 espaços em branco permitindo assim que a validação ñ funcione de forma adequada, eu já tentei até inicializar o atributo descrição com valor vazio. Ex.: descricao="";
Mas também ñ adiantou muita coisa. Eu percebi que teria que apagar os campos criados com espaços em branco para que a validação funcionasse. No qual ñ me serviria de nada. E sim antes eu utilizava a anotação @NotNull que tampouco funcionou bem, me ocorria o mesmo problema. O que será? será porque estou utilizando o para isso?
Me funciona bem a validação para caracteres maiores que 40 o @Length(max=40, message=“descricao ñ pode ultrapasar 40 caracteres”).

E também no atributo preço o valor 0 ñ esta validando de forma correta. Eu tentei utilizar por exemplo:
@Min(value = (long) 0.1, message=“preço tem que ser um valor maior que 0”)
que no qual o cast de tipo long foi o eclipse que indicou para criar e aceitei e tampouco me funciona a validação se coloco o valor 0. Me valida somente se ñ coloca valor algum.
Alguém pode me ajudar por favor??

Pois vou postar as classes aqui:

Produto:

package br.com.caelum.goodbuy.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.validator.Length;
import org.hibernate.validator.Min;
import org.hibernate.validator.NotEmpty;
import org.hibernate.validator.NotNull;



@Entity
public class Produto {

	@Id @GeneratedValue
    private Long id;
	
	@NotNull(message="Nome precisa ser preenchido")
	@Length(min=3, message="Nome precisa ter mais de 3 letras")
    private String nome;
    
	@Length(max=40, message="descricao ñ pode ultrapasar 40 caracteres")
	@NotEmpty(message="Descrição precisa ser preenchido") 
	private String descricao="";
    
	@NotNull(message="Preço precisa ser preenchido")
	@Min(value = (long) 0.1, message="preço tem que ser um valor maior que 0")
	private Double preco;
	
    public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public Double getPreco() {
		return preco;
	}
	public void setPreco(Double preco) {
		this.preco = preco;
	}
	
	
}

ProdutosController

package br.com.caelum.goodbuy.controller;

import java.util.List;

import br.com.caelum.goodbuy.dao.ProdutoDao;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.ValidationMessage;
import br.com.caelum.vraptor.view.Results.*;


@Resource
public class ProdutosController {

	private final ProdutoDao dao;
	private final Result result;
	private final Validator validator;

	public ProdutosController(ProdutoDao dao, Result result, Validator validator) {
		this.dao = dao;
		this.result = result;
		this.validator = validator;

	}

	public void remove(Long id) {
		Produto produto = dao.carrega(id);
		dao.remove(produto);
		result.redirectTo(this).lista();
	}

	public Produto edita(Long id) {
		return dao.carrega(id);
	}

	public void altera(Produto produto) {
		dao.atualiza(produto);
		result.redirectTo(this).lista();
	}

	public List<Produto> lista() {
		return dao.listaTudo();
	}
	
	public void formulario() {

	}

	public void adiciona(final Produto produto) {
        validator.validate(produto);
        validator.onErrorUsePageOf(ProdutosController.class).formulario();
        dao.salva(produto);
        result.redirectTo(this).lista();
    }
	/**
      * Metodo Adiciona Utilizando o Validaor do VRaptor
	
	public void adiciona(final Produto produto) {
	       if (produto.getNome() == null ||
	               produto.getNome().length() < 3) {
	           validator.add(new ValidationMessage(
	                   "Nome e&#769; obrigato&#769;rio e precisa ter mais" +
	                   " de 3 letras", "produto.nome"));
	       }
	       if (produto.getDescricao() == null ||
	               produto.getDescricao().length() > 40) {
	           validator.add(new ValidationMessage(
	                   "Descric&#807;a&#771;o e&#769; obrigato&#769;ria na&#771;o pode ter mais" +
	                   " que 40 letras", "produto.descricao"));
	       }
	       if (produto.getPreco() == null || produto.getPreco() <= 0) {
	           validator.add(new ValidationMessage(
	                   "Prec&#807;o precisa ser um valor positivo", "produto.preco"));
	       }
	       validator.onErrorUsePageOf(ProdutosController.class)
	               .formulario();
	       dao.salva(produto);
	       result.redirectTo(this).lista();
	}

**/

}

[quote]Abaixo envio a imagem da validação e outra coisa porque ñ me sai bem o nome descrição e preço no navegador, me sai assim: DescriçaÌ?o:, Preço:
Sei que deve ser algo com padronização sei que devo utilizar a UTF-8, mas aonde faria isso? são essas 3 dúvidas que tenho, muito obrigado!
[/quote]


Se entendi bem suas dúvidas são:

  • Espaços que aparecem no textarea.
  • Validação de um Double.
  • Encode da página.

- Espaços que aparecem no textarea.
Poste o código do seu JSP. Provavelmente você mesmo está inserindo o espaço nele. O código deveria ser:

- Validação de um Double.
@Min é para inteiros. Para decimal você usa @DecimalMin.

- Encode da página.
Você precisa definir o encode do seu projeto como UTF-8, colocar no Header dos seus JSP’s e também setar um parâmetro no web.xml para o VRaptor tratar isso:

<context-param> <param-name>br.com.caelum.vraptor.encoding</param-name> <param-value>UTF-8</param-value> </context-param>

[quote=fredericomaia10]Se entendi bem suas dúvidas são:

  • Espaços que aparecem no textarea.
  • Validação de um Double.
  • Encode da página.

- Espaços que aparecem no textarea.
Poste o código do seu JSP. Provavelmente você mesmo está inserindo o espaço nele. O código deveria ser:

- Validação de um Double.
@Min é para inteiros. Para decimal você usa @DecimalMin.

- Encode da página.
Você precisa definir o encode do seu projeto como UTF-8, colocar no Header dos seus JSP’s e também setar um parâmetro no web.xml para o VRaptor tratar isso:

<context-param> <param-name>br.com.caelum.vraptor.encoding</param-name> <param-value>UTF-8</param-value> </context-param>[/quote]

Olá frederico,
primeiro de tudo muito obrigado pela atenção.
Aqui esta o código do formulario.jsp

<form action="adiciona">
       <fieldset>
           <legend>Adicionar Produto</legend>
	           
	           <label for="nome">Nome:</label>
	           <input id="nome" type="text" name="produto.nome" value="${produto.nome}"/>
	           
	           <label for="descricao">Descric&#807;a&#771;o:</label>
	           <textarea id="descricao" name="produto.descricao">${produto.descricao} </textarea>
	           
	           <label for="preco">Prec&#807;o:</label>
	           <input id="preco" type="text" name="produto.preco" value="${produto.preco}"/>
	           
           <button type="submit">Enviar</button>
       </fieldset>
</form>

Depois de sua ajuda eu notei que realmente o problema era o espaço em branco que deixei no como pode ver no final. Corrigi isso e já me funciona adequadamente esta parte.

Já na validação de um Double eu tentei fazer isso e o eclipse me mostrou que não existe esta anotação @DecimalMin no Hibernate. Pois o eclipse me indicou que eu deveria criar uma anotação ‘DecimalMin’

Package: br.com.caelum.goodbuy.modelo public @interface DecimalMin { }

E também tentei manualmente importar esse @DecimalMin e ñ existe essa opção. Ex.: import org.hibernate.validator.DecimalMin;

Pois na apostila indica para colocar o @Min(0) e me ensina na apostila também que existe estes 7 campos para validar com o Hibernate:
[list]? @NotNull, para campos obrigatórios
? @NotEmpty, idem, mas também não aceita String vazia
? @Length, para impor restrições sobre o tamanho (min e max)
? @Min e @Max, para restringir o valor de números
? @Past e @Future, para impor restrições temporais
? @Pattern, para restringir valores usando uma expressão regular
? @Email, conferir validade de e-mail
[/list]

Já no Encode da Página eu tentei fazer o que você indicou e não consegui resolver o problema, vou postar como ficou os arquivos.

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>goodbuy</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	
	<!-- configura o controlador do VRaptor -->
	<filter>
		<filter-name>vraptor</filter-name>
		<filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>vraptor</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>
	
	<context-param>  
    	<param-name>br.com.caelum.vraptor.encoding</param-name>  
    	<param-value>UTF-8</param-value>  
	</context-param> 
	
	<jsp-config>
		<jsp-property-group>
			<description>goodbuy</description>
			<display-name>Good Buy</display-name>
			<url-pattern>*.jsp</url-pattern>
			<include-prelude>/header.jspf</include-prelude>
			<include-coda>/footer.jspf</include-coda>
		</jsp-property-group>
	</jsp-config>
</web-app>

E no arquivo header.jspf

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
	<head>
		<title>Good Buy</title>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<link href="<c:url value="/goodbuy.css"/>" rel="stylesheet" type="text/css" media="screen" />
		<link href="<c:url value="/javascripts/jquery.autocomplete.css"/>" rel="stylesheet" type="text/css" media="screen" />
		<script type="text/javascript" src="<c:url value="/javascripts/jquery-1.3.2.min.js"/>"></script>
		<script type="text/javascript" src="<c:url value="/javascripts/jquery.validate.min.js"/>"></script>
		<script type="text/javascript" src="<c:url value="/javascripts/jquery.autocomplete.min.js"/>"></script>
		<script type="text/javascript" src="<c:url value="/javascripts/jquery.puts.js"/>"></script>
		<fmt:setLocale value="pt_br"/>
	</head>
	
<body>
	<div id="header">
		
	</div>
	<div id="erros">
		<ul>
			<c:forEach items="${errors}" var="error">
               <li>${error.category} - ${error.message}</li>
            </c:forEach>
		</ul>
	</div>
	<div id="body">
		<div id="menu">
			<ul>
				<li><a href="<c:url value="/produtos/formulario"/>">Novo Produto</a></li>
           <li><a href="<c:url value="/produtos/lista"/>">Lista Produtos</a></li>
			</ul>
		</div>
		<div id="content">