VRaptor 4: Problemas com jsp + tag select + ManyToOne

2 respostas
mhks

Olá pessoal.

Possuo duas entidades Produto e Categoria, com um relacionamento ManyToOne.
O formulário de cadastro de produtos possui um combo box/select com todas as categorias cadastradas.
Entretanto, não consigo settar o atributo categoria do produto para salvá-lo.

Se alguém puder me explicar como arrumar isso, ou uma solução mais elegante, agradeço muito.
Segue abaixo o que consegui fazer:

@Entity
public class Produto {
	
	@Id @GeneratedValue
	private Long id;
	
	private String nome;
	
	@ManyToOne
	private Categoria categoria;

	// ...
}
@Entity
public class Categoria {

	@Id @GeneratedValue
	private Long id;

	private String nome;
	
	// ...
}
@Controller
public class ProdutoController {

	@Inject
	private ProdutoDao dao;

	@Inject
	private CategoriaDao categoriaDao;

	@Inject
	private Result result;

	@Get("/produtos/novo")
	public void form() {
		result.include("categorias", categoriaDao.listaTudo());
	}

	@Post("/produtos")
	public void adiciona(Produto produto, Categoria categoria) {
		produto.setCategoria(categoria); // ??
		dao.salva(produto);
		result.redirectTo(this).lista();
	}
}
<form id="produtoForm" action="<c:url value="/produtos"/>" method="post">
	<div>
		<label for="nome">Produto</label>
		<input id="nome" name="produto.nome">
	</div>
			
	<div>
		<label for="categoria">Categoria</label>
		<select id="categoria" name="produto.categoria">
			<c:forEach items="${categorias}" var="categoria">
				<option value="${categoria.id}">${categoria.nome}</option>
			</c:forEach>
		</select>
	</div>
		
	<button type="submit">Enviar</button>
</form>

2 Respostas

mhks

Consegui resolver:

public void adiciona(Produto produto) {
		produto.setCategoria(categoriaDao.carrega(produto.getCategoria().getId()));
		dao.salva(produto);
		result.redirectTo(this).lista();
	}

	<label for="categoria">Categoria</label>
	<select id="categoria" name="produto.categoria.id">
		<c:forEach items="${categorias}" var="categoria">
			<option value="${categoria.id}">${categoria.nome}</option>
		</c:forEach>
	</select>

Meu problema é que não tinha me ligado que name=“produto.categoria.id” instancia um objeto categoria mas põe apenas o id dele, então é necessário fazer uma busca no banco e setar o objeto certo antes de salvar o produto.

N

criei uma conta so pra lhe agradecer pela á ajuda :grin:.
Estava com o mesmo erro valew mesmo.

Criado 14 de setembro de 2015
Ultima resposta 8 de mai. de 2017
Respostas 2
Participantes 2