Problema para popular classe com relacionamentos com os dados vindos de formulário

2 respostas
jamesfrj

Fala pessoal!

Estou tentando fazer uma pequena aplicação Spring com Hibernate. Estou com problema para inserir uma classe que tem relacionamentos. Segue a definição dela abaixo:
// Generated Oct 16, 2012 9:26:52 AM by Hibernate Tools 3.4.0.CR1

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
 * Livro generated by hbm2java
 */
@Entity
@Table(name = "livro", catalog = "db_livro")
public class Livro implements java.io.Serializable {

	private Long id;
	private Categoria categoria;
	private Autor autor;
	@Size(min = 5)
	@NotNull
	private String titulo;
	@NotNull
	@Size(min = 5)
	private String isbn;
	private Double precoAtual;
	private Double precoVenda;

	public Livro() {
	}

	public Livro(String titulo) {
		this.titulo = titulo;
	}

	public Livro(Categoria categoria, Autor autor, String titulo, String isbn,
			Double precoAtual, Double precoVenda) {
		this.categoria = categoria;
		this.autor = autor;
		this.titulo = titulo;
		this.isbn = isbn;
		this.precoAtual = precoAtual;
		this.precoVenda = precoVenda;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "id", unique = true, nullable = false)
	public Long getId() {	
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "categoria_id")
	public Categoria getCategoria() {
		return this.categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "autor_id")
	public Autor getAutor() {
		return this.autor;
	}

	public void setAutor(Autor autor) {
		this.autor = autor;
	}

	@Column(name = "titulo", nullable = false, length = 45)
	public String getTitulo() {
		return this.titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	@Column(name = "isbn", length = 20)
	public String getIsbn() {
		return this.isbn;
	}

	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}

	@Column(name = "preco_atual", precision = 22, scale = 0)
	public Double getPrecoAtual() {
		return this.precoAtual;
	}

	public void setPrecoAtual(Double precoAtual) {
		this.precoAtual = precoAtual;
	}

	@Column(name = "preco_venda", precision = 22, scale = 0)
	public Double getPrecoVenda() {
		return this.precoVenda;
	}

	public void setPrecoVenda(Double precoVenda) {
		this.precoVenda = precoVenda;
	}

}
Esse é o jsp que uso para inserir: formulario.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"  %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>Controle de Livros</title>
</head>
<body>
	<h3>Adicionar livros</h3>
	<form action="adicionaLivro" method="post">
		ISBN:<br />
		<input type="text" name="isbn" />
		<!--<form:errors path="livro.isbn" cssStyle="color: red;" />-->
		<br />
		
		Categoria:<br />
		<select name="categoria" id="categoria">
			<c:forEach items="${categorias}" var="categoria">
				<option value="${categoria.id}">${categoria.nome}</option>
			</c:forEach>	
		</select>
		
		<!--<form:errors path="livro.categoria" cssStyle="color: red;" />-->
		<br />	

		Título:<br />
		<input type="text" name="titulo" />
		<!--<form:errors path="livro.titulo" cssStyle="color: red;" />-->
		<br />
		
		Autor:<br />
		<select name="autor" id="autor">
			<c:forEach items="${autores}" var="autor">
				<option value="${autor.id}">${autor.nome}</option>
			</c:forEach>	
		</select>
		<!--<form:errors path="livro.autor" cssStyle="color: red;" />-->
		<br />	
		
		Preço Atual:<br />
		<input type="text" name="precoAtual" />
		<!--<form:errors path="livro.precoAtual" cssStyle="color: red;" />-->
		<br />
		
		Preço Venda:<br />
		<input type="text" name="precoVenda" />
		<!--<form:errors path="livro.precoVenda" cssStyle="color: red;" />-->
		<br />		
					
		<input type="submit" value="Adicionar"/>
	</form>
</body>
</html>
Quando tento inserir acontece este erro:
SEVERE: Servlet.service() for servlet springmvc threw exception
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'livro' on field 'autor': rejected value [7]; codes [typeMismatch.livro.autor,typeMismatch.autor,typeMismatch.br.com.coldsoft.livros.model.Autor,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [livro.autor,autor]; arguments []; default message [autor]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'br.com.coldsoft.livros.model.Autor' for property 'autor'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [br.com.coldsoft.livros.model.Autor] for property 'autor': no matching editors or conversion strategy found]
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:810)
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:359)
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Não sei se é isso, mas me parece que está dando erro de "tipos misturados" para o objeto Autor em relação ao que está vindo do formulário. Alguém tem alguma dica de como resolver isso?

Obrigado!

2 Respostas

jamesfrj

Pessoal, o resumo do meu problema então é:
A entidade Livro tem 2 Chaves Estrangeiras (Categoria e Autor). O meu problema é converter os dados do formulário de Inserção de Livro que populo com 2 combos (id categoria e id Autor) nesses dois objetos que serâo criados dentro de livro (Categoria e Autor).
E o erro:

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors Field error in object 'livro' on field 'autor': rejected value [7]; codes [typeMismatch.livro.autor,typeMismatch.autor,typeMismatch.br.com.coldsoft.livros.model.Autor,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [livro.autor,autor]; arguments []; default message [autor]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'br.com.coldsoft.livros.model.Autor' for property 'autor'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [br.com.coldsoft.livros.model.Autor] for property 'autor': no matching editors or conversion strategy found]
Alguém já passou por uma situação parecida?

jamesfrj

Alguém?

Criado 11 de novembro de 2012
Ultima resposta 14 de nov. de 2012
Respostas 2
Participantes 1