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>[/code]
Quando tento inserir acontece este erro:
[code]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!