[RESOLVIDO] VRaptor - Adicionando novos recursos a goodbuy

Opa…

Então, estou fazendo com que a loja do goodbuy agora possa reaalizar a compra dos produtos no carrinho de compras.
Pensei em algo simples, sem aumentar mto a complexidade… Só para testar mesmo…

Então o que eu fiz:

1 - Decidi persistir a classe Item direto no banco, apenas linquei cada Item a um usuario específico… então para fazer isto eis a classe:

//imports

@Entity
public class Item {

	@Id @GeneratedValue
	private Long id;
	
	@ManyToOne
	private Usuario usuario;
	
	@OneToOne
	private Produto produto;
	
	private Integer quantidade;
	//getters e setters	
}

2 - Criei um método no Carrinho para limpar os dados depois que efetura a compra:

	public void limpar() {
	      itens.clear();
	      total = 0.0;	
	}

3 - Criei, no CarrinhoController um novo recurso, “comprar”:

	@Restrito
	@Post @Path("/comprar")
	public void comprar() throws Exception{
		for(Item item : carrinho.getItens()){
			itemDao.salvar(item);
		}
		
		carrinho.limpar();
		result.redirectTo(ProdutosController.class).lista();

	}

4 - Criei um botão no view do carrinho pra poder efetuar a compra:

<c:if test="${usuarioWeb.logado}">
<form action="<c:url value="/comprar"/>" method="post">
<input type="submit" value="Comprar">
</form>
</c:if>

5 - Criei o campo do tipo hidden pra pegar o id do usuario [acho que esta parte esta incorreta]

<input type="hidden" name="item.usuario.id"
value="${usuarioWeb.usuario.id}"/>

Pronto, acho q nao esqueci de nada…
Qual o problema?

Eis o que é salvo no banco de dados:

+----+------------+------------+------------+
| id | quantidade | produto_id | usuario_id |
+----+------------+------------+------------+
|  1 |         10 |          1 |       NULL |
|  2 |         10 |          7 |       NULL |
|  3 |          5 |          1 |       NULL |
|  4 |          5 |          7 |       NULL |
+----+------------+------------+------------+

Não esta pegando o ID do usuario :frowning:
Acho que o erro está no item 5,
mas não sei…

Podem me ajudar?
Abraços

No item 5, ao invés de usar um campo hidden, por que você não recebe o UserWeb no construtor do seu DAO e lá você seta o usuário?

principalmente pra evitar que uma pessoa salve um item de outro usuário (mudando o id no input), vc deveria fazer essa ligação no servidor… por exemplo no controller, ou no dao, como o Rafael falou.

Boa ideia…ehehhehe

fui implementar e me deparei com uma duvida…

Se eu tenho um objeto na sessão, no lado jsp
basta eu fazer o seguinte para acessa-lo:

${objeto}

Mas e do lado java?

Eu sei que se fosse usando servlets usaria o

HttpSession sessao = request.getSession(true);
Object obj = sessao.getAtribute("meuObjeto");

Acho que seria mais ou menos assim…
mas e agora, como q faço isto usando o vraptor?

Só recebe ele no construtor:

private Objeto obj;
public Construtor(Objeto obj){
this.obj = obj;
}

Obrigado pela ajuda galera…

100% resolvido. Obrigado mesmo.
Eu estou com outro problema…
Afim de ajudar outros usuarios com a mesma duvida,
não vou utilizar este mesmo tópico , e vou criar outro.

Eis o link: http://www.guj.com.br/java/272763-vraptor—corrigindo-erro-de-logica-do-goodbuy-adicionar-o-mesmo-produto-duas-vezes-ao-car#1431933

Obrigado mesmo pela ajuda.
Estou gostando mto deste framework.
:slight_smile:

d34d_d3v1l vc teria esse projeto para download para eu poder estudar esse novo recurso. obrigado att

Cara o goodbuy eu peguei da apostila da caelum.
Agora essas novas funcionalidades e tal, eu não tenho mais.

É meio antigo o tópico :slight_smile:
Foi mall !!
Abraços

Como que eu faço para receber o usuarioWeb no construtor, pois nao esta salvando o id do usuário.

fiz isso no carrinhoController

private final UsuarioWeb usuarioWeb;
....
public CarrinhoController(Carrinho carrinho, ProdutoDAO dao,ItemDAO itemDao, UsuarioWeb usuarioWeb, Result result) {
		this.carrinho = carrinho;
                this.usuarioWeb = usuarioWeb;

...
@Restrito  
	@Post @Path("/comprar")  
	public void comprar() throws Exception{  
	    for(Item item : carrinho.getItens()){ 
	        itemDao.adiciona(item); 
	    }
	    carrinho.limpar();  
	    result.redirectTo(ProdutosController.class).lista();  
	}

Classe item

[code]@Entity
public class Item {

@Id
@GeneratedValue
private Long id;

@OneToOne
private Produto produto;

@ManyToOne  
private Usuario usuario;  [/code]

Mais não salvando sei que tem algo de errado mais nao estou sabendo resolver… grato

Não basta simplesmente receber o UserWeb no construtor, você precisa usá-lo… Faça assim:

1- Receba UserWeb no ItemDao.
2- Remova de CarrinhoController.
3- No método adiciona de ItemDao, vc pega o UserWeb e seta dentro de um Item. Depois você salva e pronto.

Desculpe minha ignorância,

1- Receba UserWeb no ItemDao.

private final UsuarioWeb usuarioWeb; public ItemDAO(EntityManager em, UsuarioWeb usuarioWeb ) { this.em = em; this.usuarioWeb = usuarioWeb;

2- Remova de CarrinhoController. OK

Como Faço?

3- No método adiciona de ItemDao, vc pega o UserWeb e seta dentro de um Item. Depois você salva e pronto.

public void adiciona(Item t) { ... dao.adiciona(t); }

[quote=well]
1- Receba UserWeb no ItemDao.

private final UsuarioWeb usuarioWeb; public ItemDAO(EntityManager em, UsuarioWeb usuarioWeb ) { this.em = em; this.usuarioWeb = usuarioWeb; [/quote]
Isso mesmo.

[quote=well]
2- Remova de CarrinhoController. OK

Como Faço?[/quote]
É só para você remover o UserWeb de CarrinhoController, pois acredito que você não esteja usando.

[quote=well]
3- No método adiciona de ItemDao, vc pega o UserWeb e seta dentro de um Item. Depois você salva e pronto.

public void adiciona(Item t) { ... dao.adiciona(t); }[/quote]
Algo assim:

public void adiciona(Item t) { t.setUser(userWeb.getUsername()); dao.adiciona(t); }

Funcionou mais tive que alterar algumas coisas, não sei se serio o ideal;

Como vc disse no ItemDAO:

public void adiciona(Item t) { t.setUsuario(usuarioWeb.getId()); dao.adiciona(t); }

na class Item tive de alterar de

@ManyToOne private Usuario usuario;

Para:

Não sei se ficou o ideal mais funcionou.

Obrigado

Nesse caso, o ideal seria se você capturasse o usuário do banco de dados baseado no ID do UserWeb…

Fica muito complicado fazer isso?

Não. Receba o UsuarioDao no contrutor de ItemDao e faça um usuarioDao.carrega(userWeb.getId());

Obrigado, mais revolvi de outra forma, eu estava esquecendo do get e do set do usuario na classe usuarioWeb, assim nao precisa pegar o id eu pego logo o usuario logado.

Muito obrigado me ajudou muito.

Não é muito legal colocar o usuário do banco de dados dentro de UserWeb… Coloque somente os atributos que você precisa. Quando você precisar usar, vc o captura no dao de usuário.

Entendi, fico grato pela dica… mais como é apenas uma solução temporária vou deixar assim e depois tendo mudar… Muito obrigado.