Problema update Hibernate + Vraptor

15 respostas
C

pessoal

estou tentando fazer um procedimento de atualização, eu tenho um campo data, porem quando mando atualizar atualiza todos os campos corretamente exeto o data, como posso corrigir isso?

vlw

<form action="<c:url value="/boletim/${boletim.id}"/>" method="post">
		<fieldset>
			<legend>Edição de Boletins</legend>
			
                        <!-- -------------------------------------------------------------------------------- -->
			<label>Data</label>
			<input type="text" name="${boletim.data}" value="${boletim.data}">

			<!-- -------------------------------------------------------------------------------- -->

			<label>Atividade</label>
			<select name="boletim.atividade.id">
				<option selected="selected">Selecione uma Atividade</option>
				<c:forEach items="${atividadesList}" var="atividade">
					<option value="${atividade.id}" <c:if test="${boletim.atividade.id==atividade.id}">Selected="true"</c:if> >${atividade.atividade}</option>
				</c:forEach>
			</select>
			
			<label>Imóvel</label>
			<input type="text" id="ender" value="${boletim.imovel.endereco.nome}, ${boletim.imovel.numero}"/>
			<input type="hidden" name="boletim.imovel.id" id="endereco" value="${boletim.imovel.id}">
			
			<label>Situação do Imóvel</label>
			<select name="boletim.situacaoimovel.id">
				<option selected="selected">Selecione uma Situação</option>
				<c:forEach items="${situacaoimovelList}" var="situacao">
					<option value="${situacao.id}" <c:if test="${boletim.situacaoimovel.id==situacao.id}">Selected="true"</c:if>>${situacao.situacao}</option>
				</c:forEach>
			</select>
			
			<label>Controle Mecânico</label>
			<select name="boletim.controlemecanico">
				<option value="True" <c:if test="${boletim.controlemecanico==true}">Selected="true"</c:if>>Sim</option>
				<option value="False" <c:if test="${boletim.controlemecanico==false}">Selected="true"</c:if>>Não</option>
			</select>
			
			<label>Matricula</label>
			<input type="text" name="boletim.agente.matricula" value="${boletim.agente.matricula}">
			
			<button type="submit" name="_method" value="put">Enviar</button>
			<INPUT id="button" TYPE="button" VALUE="Cancelar" onClick="history.back()">
		</fieldset>
	</form>

controller

@Put
	@Path("/boletim/{boletim.id}")
	public void atualizar(Boletim boletim) {
		Funcionario f = fdao.getFuncionarioPorMatricula(boletim.getAgente().getMatricula());
		boletim.setAgente(f);
		
		if (dao.atualizar(boletim)) {
			result.redirectTo(BoletimController.class).listar();
		} else {
			validator
					.add(new ValidationMessage("Boletim já Cadastrado", "Erro"));
			validator.onErrorUse(Results.page()).of(BoletimController.class)
					.editar(boletim.getId());
		}

	}

15 Respostas

Lucas_Cavalcanti

o erro está aqui:

<input type="text"  name="${boletim.data}" value="${boletim.data}">

vc não deve usar EL no name… o certo é:

<input type="text"  name="boletim.data" value="${boletim.data}">

além disso, use a tag fmt:formatDate pra mostrar a data

C

Lucas eu alterei o name, mas o problema continua, qdo eu atualizo o campo data fica nulo.

vlw

Lucas_Cavalcanti

qual formato de data vc tá usando?
qual é o locale do servidor?

se o formato da data é: dd/MM/yyyy (11/07/2010, por exemplo), vc tem que estar com o Locale pt-BR…

dá pra setar isso no web.xml:

<context-param>
  <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
  <param-value>pt_BR</param-value>
</context-param>
C

Lucas

Vlw, pelo codigo acima coloquei no web.xml e deu certo, mas ainda tenho uma dúvida:

eu coloquei

<fmt:formatDate value="${boletim.data}" type="both" pattern="dd/MM/yyyy"  dateStyle="full"/>

para exibir a data, e está ok. eu quero apenas exibir a data para o usuário não alterar mas como eu faço para definir que ele é o campo data pq se fosse um input text como tinha colocado eu usaria o name=“boletim.data” mas esse comando não permite isso, e se eu usar um campo hidden o valor nao fica formatado certo.

vlw.

Lucas_Cavalcanti

coloque readonly=“readonly” no input, daí o usuário não consegue alterar o campo…

mas o ideal é vc fazer isso do lado do servidor, só alterar os campos que vc quer que venham no formulario…

algo assim:

public void altera(Boletim boletim) {
    Boletim persistente = dao.load(boletim.getId());
    
    persistente.setCampo1(boletim.getCampo1());
    //...
    persistente.setCampoN(boletim.getCampoN());
}
C

Vlw Lucas

agora está certinho.

t+

H

Olá.
Estou seguindo os exercícios da apostila do FJ-28, capítulo 9, Validando Formulários, página 76, Exercício opcional 6.
A validação no “adiciona” funcionou perfeitamente, porém estou tendo problemas na validação do “altera”.

A validação funcionou, coloquei para que o nome do produto a ser alterado obrigatoriamente tenha conteúdo e possua mais de 3 letras, o problema está nas mensagens de erro, que assim que eu clico no link “altera”, a página “edita.jsp” já exibe o “div” de erros (em branco) sem mesmo eu alterar, e mesmo após eu alterar de forma errada (nome com 2 letras por exemplo) o “div” dos erros ainda é exibido em branco.

public void altera(Produto produto) {
		if (produto.getNome() == null || produto.getNome().length() < 3) {
			validator.add(new ValidationMessage("Nome é obrigatório e precisa ter mais de 3 letras", "produto.nome"));
		}
		validator.onErrorUse(Results.page()).of(ProdutoController.class).edita(produto.getId());
		dao.atualiza(produto);
		result.redirectTo(ProdutoController.class).lista();
	}

No edita.jsp:

<div id="erros">
		<ul>
		<c:forEach items="${errors}" var="error">
			<li>${error.category } - ${error.message }</li>
		</c:forEach>
		</ul>
	</div>

Gostaria de saber como utilizo o validator.onErrorUse para fazer uma alteração.

Obrigado

Lucas_Cavalcanti

bom, não sei se eu entendi direito a dúvida mas:

-pra div de erros só aparecer qdo houver erros, vc precisa colocá-la dentro de um c:if:

<c:if test="${not empty errors}">
   <div id="errors">......</div>
</c:if>
  • qdo tem errors a div aparece em branco, ou com uma lista em branco?

  • como assim fazer uma alteração no validator.onErrorUse?

H

É, acho que não ficou muito claro o último post mesmo… rs

vamos lá, o que eu presumo que esteja acontecendo, é que ao tentar validar o campo “nome” na criação do “produto”, é criado uma nova entrada no banco, portanto não é enviado nenhum parâmetro ao jsp:

Esse [incluir], funciona perfeitamente, o “div erros” só aparece quando eu tento gravar algo que tenha menos de 3 letras (mesmo sem colocar o div no if que você mencionou no último post).

ao tentar fazer uma alteração no produto, é enviado ao jsp um “id” como parâmetro (para o formulário já iniciar preenchido, e realizar a alteração), e por esse motivo acho que [mesmo tentando com o if que você me passou no post] o “div erros” aparece em branco, em branco mesmo, sem lista.

Seguindo o exemplo da apostila do FJ-28 (capítulo 9, Validando Formulários, página 76, Exercício opcional 6…), como eu poderia validar o formulário na alteração dos produtos?

Desde já, muito obrigado!

Lucas_Cavalcanti

bom, ainda não entendi direito a sua dúvida…

pros dados do seu formulario voltar preenchido vc precisa fazer algo do tipo nos seus inputs:

<input type="text" name="produto.nome" value="${produto.nome}" />

ou seja, vc precisa preencher os values…

se isso não funcionar, verifique se vc tá com expression language habilitado

H

Ok...

Estou seguindo à risca a apostila.
A aplicação já funcionava perfeitamente, (listagem, inclusão, remoção e alteração [os dados eram preenchidos no form alteração, "values"]).
Estava tudo pronto até o capítulo 8 da apostila.

No capítulo 9, "Validando formulários", criei a validação para a inclusão de produtos. Perfeito.
Minha dificuldade está sendo em criar a validação na "alteração", mais precisamente na informação de erros ao usuário.

Na inclusão, aparece limpo o formulário, após eu entrar com os dados, ele aparece o "div erros" SOMENTE SE o nome estiver com menos de 3 letras, e a mensagem de erro aparece perfeitamente.
if (produto.getNome() == null
				|| produto.getNome().length() < 3) {
			validator.add(new ValidationMessage(
					"Nome é obrigatório e precisa ter mais de 3 letras",
					"produto.nome"));
		}
E no jsp:
<c:forEach items="${errors}" var="error">
<li>${error.category } - ${error.message }</li>
</c:forEach>

Na alteração, esse "div erros" já inicia (em branco) no formulário de edição (que aparece com os values perfeitamente).
A validação também está funcionando, pois se eu altero o nome para menos de 3 letras ele permanece no formulário de edição com os valores preenchidos, sem gravar, porém o "div erros" continua em branco, sem mostrar a mensagem de erro.

Sou iniciante no VRaptor, por isso, resolvi seguir exatamente a apostila.

Acho que ficaria mais simples a pergunta da seguinte forma: Qual seria a resolução do exercício opcional 6 da apostila FJ28?
Tentei resolver de todas as formas tratadas na apostila, sem sucesso.

Vlw...

Lucas_Cavalcanti

vc tah fazendo a validação na lógica de alterar tb?

H

Certo, vou enviar de uma forma mais completa:

ProdutoController:

public void formulario() {

}

public Produto edita(Long id) {
        return dao.carrega(id);
}
	
public void adiciona(Produto produto) {
	if (produto.getNome() == null || produto.getNome().length() < 3) {
		validator.add(new ValidationMessage("Nome é obrigatório e precisa ter mais de 3 letras","produto.nome"));
	}
	validator.onErrorUse(Results.page()).of(ProdutoController.class).formulario();
	dao.salva(produto);
	result.redirectTo(ProdutoController.class).lista();
}

public void altera(Produto produto) {
	if (produto.getNome() == null|| produto.getNome().length() < 3) {
		validator.add(new ValidationMessage("Nome é obrigatório e precisa ter mais de 3 letras","produto.nome"));
	}
	validator.onErrorUse(Results.page()).of(ProdutoController.class).edita(produto.getId());
	dao.atualiza(produto);
	result.redirectTo(ProdutoController.class).lista();
}

O método que adiciona, é chamado no “formulario.jsp”, não necessita passar nenhum parâmetro, pois estou fazendo um auto_increment.
No método que altera eu envio o getId para carregar os dados no formulário de alteração “edita.jsp”.

Lucas_Cavalcanti

no altera, troque o

validator.onErrorUse(Results.page()).of(ProdutoController.class).edita(produto.getId());

por

validator.onErrorUse(Results.logic()).forwardTo(ProdutoController.class).edita(produto.getId());

dica: a partir do VRaptor 3.1.3 vc pode fazer:

validator.onErrorForwardTo(this).edita(produto.getId());
//ou
validator.onErrorUsePageOf(this).formulario();
H

RESOLVIDO!

Como estou utilizando o VRaptor 3.1.3, utilizei da forma que você passou. Funcionou perfeitamente.

Valeu Lucas!

Criado 10 de julho de 2010
Ultima resposta 30 de set. de 2010
Respostas 15
Participantes 3