VRaptor 4: Problemas com jsp + tag select + ManyToOne

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;

	// ...
}

[code]@Entity
public class Categoria {

@Id @GeneratedValue
private Long id;

private String nome;

// ...

}[/code]

[code]@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();
}

}
[/code]

<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>

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.

1 curtida

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