[Resolvido][VRaptor] Atributo de sessão não criado automaticamente

7 respostas
rfa1989

Olá a todos.

Estou estudando VRaptor usando a apostila FJ-28 da Caelum e estou naquela parte em que implemento um carrinho de compras e crio uma view jsp para ele.

Eu anotei minha classe Carrinho com @SessionScoped, mas de alguma forma não estou ganhando automaticamente o atributo de sessão ${carrinho} para ser usado nos meus jsp’s.

Minha pergunta é: Existe alguma configuração adicional que estou perdendo (talvez algo no web.xml) ?

Para ajudar, coloco um pouco do código:

@Component
@SessionScoped
public class Carrinho {

	private List<Item> itens = new ArrayList<Item>();
	private Double total = 0.0;
  
        //getters e setters
@Resource
public class CarrinhoController {
	
	private Carrinho carrinho;
	private ProdutoDAO dao;
	private Result result;
	
	public CarrinhoController(Carrinho carrinho, ProdutoDAO dao, Result result) {
		this.carrinho = carrinho;
		this.dao = dao;
		this.result = result;
	}

	@Post @Path("/carrinho")
	public void adiciona(Item item) {
		dao.recarrega(item.getProduto());
		carrinho.adiciona(item);

		result.redirectTo(this).visualiza();
	}
	
	@Get @Path("/carrinho")
	public void visualiza(){
		System.out.println(carrinho.getTotalDeItens() + " " + carrinho.getTotal());
	}

visualiza.jsp abaixo

<h3>Itens do seu carrinho de compras</h3>

<table>
	<thead>
		<tr>
			<th>Nome</th>
			<th>Descrição</th>
			<th>Preço</th>
			<th>Qtde</th>
			<th>Total</th>
		</tr>
	</thead>
	
	<tbody>
		<c:forEach items="${carrinho.itens}" var="item">
			<tr>
				<td>${item.produto.nome}</td>
				<td>${item.produto.descricao}</td>
				<td>${item.produto.preco}</td>
				<td>${item.quantidade}</td>
				<td><fmt:formatNumber type="currency" value="${item.total}" /></td>
			</tr>
		</c:forEach>
	</tbody>
	
	<tfoot>
		<tr>
			<td colspan="2"></td>
			<th colspan="2">Total:</th>
			<th><fmt:formatNumber type="currency" value="${carrinho.total}"/></th>
		</tr>
	</tfoot>
</table>

Aquele sysout dentro do método visualiza não deveria estar ali. Entretanto posso garantir que os valores corretos são computados e mostrados no console a cada adição nova de produto no meu carrinho.
A questão é porque não consigo acessar esses mesmos valores de dentro do visualiza.jsp? Estou vendo os objetos sendo construidos corretamente (o sysout me garantiu isso). Pq o jsp não acessa ${carrinho.itens}?

ps: O getter getItens() existe dentro de Carrinho.

7 Respostas

Lucas_Cavalcanti

Vc está usando qual versão do VRaptor? Spring, Guice ou Pico?

rfa1989

Olá.

Seria VRaptor 3.3.1

E optei pelo PicoContainer para injeção de dependencias.

Lucas_Cavalcanti

isso não funciona no pico =( só no guice e no spring

rfa1989

Uau. Isso foi uma surpresa.

O que exatamente não funciona?
Seria essa característica de fazer um objeto marcado como SessionScoped ser manipulado como atributo de sessão nos jsp?

PS: Você se importaria de explicar porque funciona no Guice e Spring, mas não no Pico? É uma limitação do Pico ou simplesmente é uma feature que ficou pra ser implementada em versões posteriores do VRaptor?

Lucas_Cavalcanti

isso de funcionar no jsp é um detalhe de implementação do spring que a gente portou pro guice e não fez ainda pro pico

basicamente o spring coloca todo bean criado como session scoped em um atributo da httpSession com o nome da classe com primeira minúscula. No guice a gente emulou isso também…

no pico a gente coloca o container inteiro na session, não sei se tem um jeito fácil de fazer isso funcionar.

resumindo, isso era uma feature acidental :stuck_out_tongue:
cria uma issue no github por favor, pedindo isso?

rfa1989

Troquei as dependencias do Pico pelo Guice e tudo está dando certo.

Obrigado.

L

Estava com o mesmo problema Troquei pelo spring deu tudo certo

Criado 8 de março de 2011
Ultima resposta 12 de fev. de 2012
Respostas 7
Participantes 3