[RESOLVIDO] VRaptor - Adicionando novos recursos a goodbuy

18 respostas
d34d_d3v1l

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

18 Respostas

Rafael_Guerreiro

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?

Lucas_Cavalcanti

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.

d34d_d3v1l

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?

Rafael_Guerreiro

Só recebe ele no construtor:

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

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:

well

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

d34d_d3v1l

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

well

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
@Entity
public class Item {

	@Id
	@GeneratedValue
	private Long id;
	
	@OneToOne
	private Produto produto;
	
	@ManyToOne  
    private Usuario usuario;

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

Rafael_Guerreiro

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.

well

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); }

Rafael_Guerreiro

well:

1- Receba UserWeb no ItemDao.

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


Isso mesmo.

well:

2- Remova de CarrinhoController. OK

Como Faço?


É só para você remover o UserWeb de CarrinhoController, pois acredito que você não esteja usando.

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); }


Algo assim:

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

well

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

Rafael_Guerreiro

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

well

Fica muito complicado fazer isso?

Rafael_Guerreiro

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

well

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.

Rafael_Guerreiro

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.

well

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

Criado 12 de maio de 2012
Ultima resposta 25 de fev. de 2013
Respostas 18
Participantes 4