Variável Vazia (VRaptor 3 + Objectify + Low-Level API + JSP) AppEngine. [RESOLVIDO]

4 respostas
MABS

Boa Tarde.

Estou tentando utilizar o "redirectTo" do VRaptor, felizmente o redirecionamento para ouro arquivo JSP esta funcionando, mas infelizmente a variável (List) esta vazia.
Resolvi utilizar o "redirectTo" para evitar códigos duplicados em arquivos JSP's, pois tenho 7 métodos que utilizam o mesmo código JSP, mas infelizmente quando estou utilizando o "redirectTo" a variável (List) esta retornando como vazia.
Um pequeno detalhe, quando estou realizando os testes locais o código com o "redirectTo" esta funcionando normalmente, assim que realizo o deploy no AppEngine é que a varável (List) fica com seu valor vazio.
Segue abaixo os códigos que estou utilizando.

[color=red]JSP - formCadastro:[/color]
<form id="equipamentoForm" action="<c:url value="/equipamentos" />" method="post">
	<fieldset>
		<legend>Cadastro de Equipamentos</legend>
		
		<label for="patrimonio">Patrimonio:</label>
		<input id="patrimonio"  type="text" name="equipamento.patrimonio" value="${equipamento.patrimonio}"/>
		<br/>
		<label for="serie">Serie:</label>
		<input id="serie" type="text" name="equipamento.serie" value="${equipamento.serie}"/>
		<br/>
		<label for="name">Nome:</label>
		<input id="nome" type="text" name="equipamento.nome" value="${equipamento.nome}"/>
		<font size="2"><a id="nome" href="/nomeEquipamento/novo">Criar</a></font>
		
		<c:forEach items="${errors}" var="error">
 			<c:if test="${error.category == 'equipamento.nome'}">
 				<br/>
	 			<font size="2" color="red">${error.message}</font> 
 			</c:if>
		</c:forEach>
		
		<br/>
		<label for="marca">Marca:</label>
		<input id="marca" type="text" name="equipamento.marca" value="${equipamento.marca}"/>
		<font size="2"><a id="marca" href="/marcaEquipamento/novo">Criar</a></font>
		
		<c:forEach items="${errors}" var="error">
			<c:if test="${error.category == 'equipamento.marca'}">
				<br/>
				<font size="2" color ="red">${error.message}</font>
			</c:if>
		</c:forEach>
		
		<br/>
		<label for="modelo">Modelo:</label>
		<input id="modelo" type="text" name="equipamento.modelo" value="${equipamento.modelo}"/>
		<font size="2"><a id="modelo" href="/modeloEquipamento/novo">Criar</a></font>
		<br/>
		<label for="classificacao">Classificação:</label>
		<input id="classificacao" type="text" name="equipamento.classificacao" value="${equipamento.classificacao}"/>
		<font size="2"><a id="classificacao" href="/classificacaoEquipamento/novo">Criar</a></font>
		
		<c:forEach items="${errors}" var="error">
			<c:if test="${error.category == 'equipamento.classificacao'}">
				<br/>
				<font size="2" color="red">${error.message}</font>
			</c:if>
		</c:forEach>
		
		<br/>
		<label for="setor">Setor:</label>
		<input id="modelo" type="text" name="equipamento.setor" value="${equipamento.setor}"/>
		<font size="2"><a id="setor" href="/setorEquipamento/novo">Criar</a></font> 
		
		<c:forEach items="${errors}" var="error">
			<c:if test="${error.category == 'equipamento.setor'}">
				<br/>
				<font size="2" color="red">${error.message}</font>
			</c:if>
		</c:forEach>
		
		<br/>
		<button type="submit">Salvar</button>
	</fieldset>
</form>
[color=red]Obs.:[/color] Verifique o Anexo "formCadastro". [color=red]Classe - EquipamentoController:[/color]
@Resource
public class EquipamentoController {

	private final EquipamentoDao daoEquipamento;
	private final AgregacaoEquipamentoDao daoAgregacaoEquipamento;
	private final MarcaEquipamentoDao daoMarcaEquipamento;
	private final NomeEquipamentoDao daoNomeEquipamento;
	private final ClassificacaoEquipamentoDao daoClassificacaoEquipamento;
	private final SetorEquipamentoDao daoSetorEquipamento;
	private final EquipamentoNomeDao daoEquipamentoNome;
	private final EquipamentoMarcaDao daoEquipamentoMarca;

	private final Result result;
	private final Validator validator;

	public EquipamentoController(EquipamentoDao daoEquipamento,
			AgregacaoEquipamentoDao daoAgregacaoEquipamento,
			MarcaEquipamentoDao daoMarcaEquipamento,
			NomeEquipamentoDao daoNomeEquipamento,
			ClassificacaoEquipamentoDao daoClassificacaoEquipamento,
			SetorEquipamentoDao daoSetorEquipamento,
			EquipamentoNomeDao daoEquipamentoNome,
			EquipamentoMarcaDao daoEquipamentoMarca,
			Result result, Validator validator) {
		this.daoEquipamento = daoEquipamento;
		this.daoAgregacaoEquipamento = daoAgregacaoEquipamento;
		this.daoMarcaEquipamento = daoMarcaEquipamento;
		this.daoNomeEquipamento = daoNomeEquipamento;
		this.daoClassificacaoEquipamento = daoClassificacaoEquipamento;
		this.daoSetorEquipamento = daoSetorEquipamento;
		this.daoEquipamentoNome = daoEquipamentoNome;
		this.daoEquipamentoMarca = daoEquipamentoMarca;
		this.result = result;
		this.validator = validator;
	}

        @Post
	@Path("/equipamentos")
	public void salvar(Equipamento equipamento) {
		List<Equipamento> equipamentos = new ArrayList<Equipamento>();
		
		//Validacao do Nome do Equipamento
		if (equipamento.getNome() == "") {
			this.validator.add(new ValidationMessage("Nome do Equipamento é obrigatório","equipamento.nome"));
		}
		if (this.daoNomeEquipamento.busca(equipamento.getNome()) == null && equipamento.getNome() != "") {
			this.validator.add(new ValidationMessage("Por favor, crie o Nome do Equipamento","equipamento.nome"));
		}

		//Validacao da Marca do Equipamento
		if (equipamento.getMarca() == "") {
			this.validator.add(new ValidationMessage(
			"Marca do Equipamento é obrigatório","equipamento.marca"));
		}
		if (this.daoMarcaEquipamento.busca(equipamento.getMarca()) == null && equipamento.getMarca() != "") {
			this.validator.add(new ValidationMessage("Por favor, crie a Marca do Equipamento","equipamento.marca"));
		}

		//Validacao da Classificacao do Equipamento
		if (equipamento.getClassificacao() == "") {
			this.validator.add(new ValidationMessage("Classificação do Equipamento é obrigatório", "equipamento.classificacao"));
		}
		if (this.daoClassificacaoEquipamento.busca(equipamento.getClassificacao()) == null && equipamento.getClassificacao() != "") {
			this.validator.add(new ValidationMessage("Por favor, crie a Classificação do Equipamento", "equipamento.classificacao"));
		}

		//Validacao do Setor do Equipamento
		if (equipamento.getSetor() == "") {
			this.validator.add(new ValidationMessage("Setor do Equipamento é obrigatório", "equipamento.setor"));
		}
		if (this.daoSetorEquipamento.busca(equipamento.getSetor()) ==  null && equipamento.getSetor() != "") {
			this.validator.add(new ValidationMessage("Por favor, crie o Seotr do Equipamento", "equipamento.setor"));
		}
		
		this.validator.onErrorUsePageOf(this).formCadastro(equipamento);

		equipamento.setNumeroSavitec(this.daoAgregacaoEquipamento.pegaNumeroSavitecESomaMaisUm());
		this.daoEquipamentoMarca.salvar(equipamento);
		this.daoEquipamentoNome.salvar(equipamento);
		this.daoEquipamento.salvar(equipamento);
	        	
		equipamentos.add(equipamento);
		
		this.result.redirectTo(this).exibir(equipamentos);
	}

        @Get
	@Path("/equipamentos/nome")
	public List<Equipamento> exibir (List<Equipamento> equipamentos) {
		return equipamentos;
	}
}
[color=red]JSP - exibir:[/color]
<table>
	<thead>
		<tr>
			<th>Numero Savitec</th>
			<th>Patrimonio</th>
			<th>Serie</th>
			<th>Nome</th>
			<th>Marca</th>
			<th>Modelo</th>
			<th>Classificação</th>
			<th>Setor</th>
		</tr>
	</thead>
	<tbody>
		<c:forEach items="${equipamentoList}" var="equipamento">
			<tr>
				<td>${equipamento.numeroSavitecPadronizadoENG}</td>
				<td>${equipamento.patrimonio}</td>
				<td>${equipamento.serie}</td>
				<td>${equipamento.nome}</td>
				<td>${equipamento.marca}</td>
				<td>${equipamento.modelo}</td>
				<td>${equipamento.classificacao}</td>
				<td>${equipamento.setor}</td>
			</tr>
		</c:forEach>
	</tbody>
</table>
[color=red]Obs.:[/color] O Resultado quando preenchido o cadastro do Equipamento fica conforme esta no anexo "exibir".

Verifiquei que na documentação do VRaptor 3 tem um pequeno tópico sobre App Engine ([url]http://vraptor.caelum.com.br/documentacao/google-app-engine/[/url]), só que infelizmente não consegui entender.

Sucesso!
Abraço!



4 Respostas

Lucas_Cavalcanti

esse redirect só vai funcionar se vc está com sessões habilitadas no GAE…

vc pode mudar para fazer a query dessa lista de novo no método exibir.

MABS

Olá, Lucas Cavalcanti.

Acabei substituindo o “redirectTo” do VRaptor para “forwardTo” e esta funcionando só não consegui entender direito o motivo.
Qual a diferença entre os dois (“redirectTo” e “forwardTo”)?

Sucesso!
Abraço!

Lucas_Cavalcanti

forward é totalmente no servidor
redirect é no cliente (a requisição volta pro browser e ele faz a requisição para outra url) por isso que não funcionou

MABS

Olá, Lucas Cavalcanti.

Muito obrigado pela ajuda!

Sucesso!
Abraço!

Criado 12 de julho de 2011
Ultima resposta 13 de jul. de 2011
Respostas 4
Participantes 2