[RESOLVIDO] Problema ao gravar, por favor alguém ajuda?

Postei na parte de web, porém tenho uma má experiência com a sessão de web pois dentre as dúvidas que postei lá ninguém tentou me ajudar, creio então que estou postando na sessão errada e como venho com uma pergunta que faz relação a banco de dados, achei que aqui seria uma boa área para postar. Bem vamos lá

Estou fazendo um cadastro, no caso um cadastro de geração de resíduos, os resíduos são previamente cadastrados e ao cadastrar a geração deles devo receber um resíduo, ou seja, um objeto resíduo criado, um residuo pode ser gerado de vários lugares, porem cada geração deve possuir apenas um resíduo, então usei a anotação @ManyToOne logo acima da declaração, criando assim uma chave estrangeira para que seja possível acessar dados como por exemplo “Classe do resíduo com geração de id 5”

Esta apresentando um erro ao tentar adicionar fala que precisa converter para uma string, mostrarei a seguir o erro, primeiro segue minhas classes:

Classe modelo Residuo


@Entity
@Table(name = "residuo")
public class Residuo {

	@Id
	@GeneratedValue
	private Integer id;

	private String descricao;
	private String classe;
        //Outros atributos do tipo String, Getters e Setters

Classe modelo Geracao

@Entity
@Table(name = "geracao")
public class Geracao {

	@Id
	@GeneratedValue
	private Integer id;

	private String data;

	@ManyToOne
	private Residuo residuos;
        //Outros atributos Getters e Setters

       	public Residuo getResiduos() {
		return residuos;
	}

	public void setResiduos(Residuo residuos) {
		this.residuos = residuos;
	}

Trecho do código na página JSP que lista os residuos cadastrados previamente

              <td><select name="residuos">
              <option value="">&nbsp;</option>
              <c:forEach var="residuo" items="${dao.lista}">
               <option value="${residuo.id}">${residuo.descricao}</option>
               </c:forEach>
               </select></td>

Método que é chamado na ação do formulário, ou seja, ao clicar o botão gravar na interface Web

[code]
public String gravar(Geracao geracao) {
EntityManager em = new JPAUtil().getEntityManager();
GeracaoDAO dao = new GeracaoDAO(em);
em.getTransaction().begin();

	ResiduoDAO resDao = new ResiduoDAO(em);
	Residuo residuo = resDao.getBusca(geracao.getResiduos().getId());

	residuo.setId(geracao.getResiduos().getId());
	residuo.setDescricao(geracao.getResiduos().getDescricao());
	residuo.setCodonu(geracao.getResiduos().getCodonu());
	residuo.setUm(geracao.getResiduos().getUm());

	geracao.setResiduos(residuo);

	dao.getAdiciona(geracao);
	em.getTransaction().commit();
	em.close();

	return "redirect:cadastroGeracao";
}[/code]

A idéia era montar o objeto Residuo correspondente ao residuo que foi selecionado na interface gráfica web atravéz de um combo box e então seta-lo como residuo da geração para salvar como chave estrangeira na tabela geracao, porém ao tentar salvar é apresentado o seguinte erro:

[code]type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object ‘geracao’ on field ‘residuos’: rejected value [1]; codes [typeMismatch.geracao.residuos,typeMismatch.residuos,typeMismatch.br.com.e2sconsultoria.gerenciamentoe2s.modelo.Residuo,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [geracao.residuos,residuos]; arguments []; default message [residuos]]; default message [Failed to convert property value of type ‘java.lang.String’ to required type ‘br.com.e2sconsultoria.gerenciamentoe2s.modelo.Residuo’ for property ‘residuos’; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [br.com.e2sconsultoria.gerenciamentoe2s.modelo.Residuo] for property ‘residuos’: no matching editors or conversion strategy found]
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:681)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object ‘geracao’ on field ‘residuos’: rejected value [1]; codes [typeMismatch.geracao.residuos,typeMismatch.residuos,typeMismatch.br.com.e2sconsultoria.gerenciamentoe2s.modelo.Residuo,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [geracao.residuos,residuos]; arguments []; default message [residuos]]; default message [Failed to convert property value of type ‘java.lang.String’ to required type ‘br.com.e2sconsultoria.gerenciamentoe2s.modelo.Residuo’ for property ‘residuos’; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [br.com.e2sconsultoria.gerenciamentoe2s.modelo.Residuo] for property ‘residuos’: no matching editors or conversion strategy found]
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:810)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:359)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.12 logs.[/code]

Alguém tem ideia do que posso fazer para corrigir isso? Espero que aqui alguém possa me ajudar!

1 - Aguarde pela resposta, pois, ninguém fica aqui respondendo o dia todo. Geralmente, quem responde tem várias outras coisas para fazer (além de simplesmente não querer responder).
2 - Por que tanto desespero? Se é um trabalho da faculdade, por que não começou antes?
3 - Para usar @OneToMany em um atributo b, objeto da classe B, dentro da classe A , é preciso que a classe B em questão possua uma Collection de objetos a, da classe A, anotados com @ManyToOne.
4 - O erro não diz que você precisa converter para String, ao contrário, diz que o tipo String é “incastável” para o tipo Residuo. Você deve ter criado o atributo residuos como String e é este o ponto onde o erro foi cometido.
Provavelmente esteja assim

private String residuos;
//respectivos getter e setter

Quando deveria ser

private Collection<Residuo> residuos;
//respectivos getter e setter

Entendeu?

[quote=drsmachado]1 - Aguarde pela resposta, pois, ninguém fica aqui respondendo o dia todo. Geralmente, quem responde tem várias outras coisas para fazer (além de simplesmente não querer responder).
2 - Por que tanto desespero? Se é um trabalho da faculdade, por que não começou antes?
3 - Para usar @OneToMany em um atributo b, objeto da classe B, dentro da classe A , é preciso que a classe B em questão possua uma Collection de objetos a, da classe A, anotados com @ManyToOne.
4 - O erro não diz que você precisa converter para String, ao contrário, diz que o tipo String é “incastável” para o tipo Residuo. Você deve ter criado o atributo residuos como String e é este o ponto onde o erro foi cometido.
Provavelmente esteja assim

private String residuos;
//respectivos getter e setter

Quando deveria ser

private Collection<Residuo> residuos;
//respectivos getter e setter

Entendeu?
[/quote]

Cara… esse erro ocorre quando vc tenta acessar a página? … eu acho que o problema aí é o formato do elExpression…

${dao.lista} = troca o ‘$’ por ‘#’

[quote=drsmachado]1 - Aguarde pela resposta, pois, ninguém fica aqui respondendo o dia todo. Geralmente, quem responde tem várias outras coisas para fazer (além de simplesmente não querer responder).
2 - Por que tanto desespero? Se é um trabalho da faculdade, por que não começou antes?
3 - Para usar @OneToMany em um atributo b, objeto da classe B, dentro da classe A , é preciso que a classe B em questão possua uma Collection de objetos a, da classe A, anotados com @ManyToOne.
4 - O erro não diz que você precisa converter para String, ao contrário, diz que o tipo String é “incastável” para o tipo Residuo. Você deve ter criado o atributo residuos como String e é este o ponto onde o erro foi cometido.
Provavelmente esteja assim

private String residuos;
//respectivos getter e setter

Quando deveria ser

private Collection<Residuo> residuos;
//respectivos getter e setter

Entendeu?
[/quote]

drsmachado desculpe, apenas resolvi postar aqui pois caso estivesse no espaço errado, o tópico não teria sentido, sendo que as pessoas que visitam a área não iriam/saberiam ajudar.
Quanto ao que você falou, não defini o tipo como string, como pode ver no trecho de código que postei, o atributo é do tipo Residuo

caso tente aplicar a coleção, meu código quebra e começa a pedir para adicionar casting.

[quote=ralphsilver][quote=drsmachado]1 - Aguarde pela resposta, pois, ninguém fica aqui respondendo o dia todo. Geralmente, quem responde tem várias outras coisas para fazer (além de simplesmente não querer responder).
2 - Por que tanto desespero? Se é um trabalho da faculdade, por que não começou antes?
3 - Para usar @OneToMany em um atributo b, objeto da classe B, dentro da classe A , é preciso que a classe B em questão possua uma Collection de objetos a, da classe A, anotados com @ManyToOne.
4 - O erro não diz que você precisa converter para String, ao contrário, diz que o tipo String é “incastável” para o tipo Residuo. Você deve ter criado o atributo residuos como String e é este o ponto onde o erro foi cometido.
Provavelmente esteja assim

private String residuos;
//respectivos getter e setter

Quando deveria ser

private Collection<Residuo> residuos;
//respectivos getter e setter

Entendeu?
[/quote]

Cara… esse erro ocorre quando vc tenta acessar a página? … eu acho que o problema aí é o formato do elExpression…

${dao.lista} = troca o ‘$’ por ‘#’[/quote]

O erro acontece quando tento salvar, já se eu mudo o “$” por “#” a página nem abre.

Qual a versão do JSF… e que erro qeu dá?

Camarada, não tem como adivinhar a nhaca que você fez, se você não postar as classes que estão envolvidas e a jsp/xhtml completas.

Estamos aqui criando mirabolices desnecessárias. Poste os códigos inteiros.

Não estou usando JSF e sim JSP. Segue as classes completas:

JSP

[code]


Cadastro Geração


















          <td><input name="quantidade" size="20" /></td>
          <td><select name="area">
              <option value="">&nbsp;</option>
              <c:forEach var="area" items="${areaDao.lista}">
              <option value="${area.descricao}">${area.descricao}</option>
              </c:forEach>
            </select></td>
            <tr>
              <td colspan="3"><input type="submit" name="Enviar" value="Salvar" />
              <input type="reset" name="Limpar" value="Limpar" /></td>
              <td colspan="2" align="right">&nbsp;</td>
            </tr>
        </form>
      </tr>
    </table>
  </div>[/code]

GeracaoController

[code]@Controller
public class GeracaoController {
@RequestMapping("/gravar")
public String gravar(Geracao geracao, Residuo residuo) {
EntityManager em = new JPAUtil().getEntityManager();
GeracaoDAO dao = new GeracaoDAO(em);
em.getTransaction().begin();

	ResiduoDAO resDao = new ResiduoDAO(em);
	residuo = resDao.getBusca(residuo.getId());

	geracao.setResiduos(residuo);

	dao.getAdiciona(geracao);
	em.getTransaction().commit();
	em.close();

	return "redirect:cadastroGeracao";
}

@RequestMapping("/removeGeracao")
public String remove(Geracao g) {
	EntityManager em = new JPAUtil().getEntityManager();
	em.getTransaction().begin();
	GeracaoDAO dao = new GeracaoDAO(em);

	Integer id = g.getId();
	Geracao geracao = dao.getBusca(id);

	dao.getRemove(geracao);
	em.getTransaction().commit();
	em.close();

	return "redirect:consultaGeracao";
}

@RequestMapping("/editaGeracao")
public String edita(Integer id, Model model) {
	EntityManager em = new JPAUtil().getEntityManager();
	GeracaoDAO dao = new GeracaoDAO(em);
	model.addAttribute("Geracao", dao.getBusca(id));

	return "/modulos/Residuos/geracao_edicao";
}

@RequestMapping("/salvaAlteracaoGeracao")
public String salvaEdicao(Geracao g) {
	EntityManager em = new JPAUtil().getEntityManager();
	GeracaoDAO dao = new GeracaoDAO(em);
	em.getTransaction().begin();

	Integer id = g.getId();

	Geracao geracao = dao.getBusca(id);

	geracao.setId(id);
	geracao.setData(g.getData());
	geracao.setArea(g.getArea());
	geracao.setQuantidade(g.getQuantidade());
	geracao.setResiduos(g.getResiduos());
	geracao.setUm(g.getUm());

	em.getTransaction().commit();
	em.close();

	return "redirect:consultaGeracao";
}

}[/code]

Geracao

[code]@Entity
@Table(name = “geracao”)
public class Geracao {

@Id
@GeneratedValue
private Integer id;

private String data;

@ManyToOne
private Residuo residuos;

private String um;
private int quantidade;
private String area;

public Integer getId() {
	return id;
}

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

public String getData() {
	return data;
}

public void setData(String data) {
	this.data = data;
}

public Residuo getResiduos() {
	return residuos;
}

public void setResiduos(Residuo residuos) {
	this.residuos = residuos;
}

public String getUm() {
	return um;
}

public void setUm(String um) {
	this.um = um;
}

public int getQuantidade() {
	return quantidade;
}

public void setQuantidade(int quantidade) {
	this.quantidade = quantidade;
}

public String getArea() {
	return area;
}

public void setArea(String area) {
	this.area = area;
}

}[/code]

Residuo

[code]@Entity
@Table(name = “residuo”)
public class Residuo {

@Id
@GeneratedValue
private Integer id;

private String descricao;
private String classe;
private String codonu;
private String um;

public Integer getId() {
	return id;
}

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

public String getDescricao() {
	return descricao;
}

public void setDescricao(String descricao) {
	this.descricao = descricao;
}

public String getClasse() {
	return classe;
}

public void setClasse(String classe) {
	this.classe = classe;
}

public String getCodonu() {
	return codonu;
}

public void setCodonu(String codonu) {
	this.codonu = codonu;
}

public String getUm() {
	return um;
}

public void setUm(String um) {
	this.um = um;
}

}
[/code]

ResiduoController

@Controller
public class ResiduoController {
	@RequestMapping("gravarResiduo")
	public String gravarResiduo(Residuo residuo) {
		EntityManager em = new JPAUtil().getEntityManager();
		ResiduoDAO dao = new ResiduoDAO(em);
		em.getTransaction().begin();

		dao.getAdiciona(residuo);

		em.getTransaction().commit();
		em.close();

		return "redirect:cadastroResiduo";
	}
}

Desculpem a demora para responder, agradeço pela força, ainda não consegui resolver isso, espero que alguém consiga me auxiliar.

Até mais!

Data Resíduo Unidade de Medida Quantidade Área

 
<c:forEach var=“residuo” items="${dao.lista}">
${residuo.descricao}
</c:forEach>

O problema dá quando carrega a página ou quando vocÊ dá o submit?

A página e aberta normalmente e posso preencher todos os campos e selecionar o respectivo resíduo que desejo cadastrar a geração. O Erro ocorre apos clicar o botao, no submit.

cara… eu conheço pouco de spring jsp… normalmente eu uso ele com suporte a algum framework, injetando dependencias nele

mas pelo que eu estou percebendo ele está pegando o trecho abaixo e associando o name residuos ao atributo da classe… tenta comentar esse select e ve se o submit vai de boa… se for… o problema é nele…

<td><select name="residuos"> <option value=""> </option> <c:forEach var="residuo" items="${dao.lista}"> <option value="${residuo.id}">${residuo.descricao}</option> </c:forEach> </select></td>

Sim, o problema é exatamente este, como associar um objeto a um campo da web, no caso a intensão seria o usuário selecionar o resíduo que deseja, salvar, e no banco de dados ao invés de ter apenas o nome do resíduo, ter também as características dele, como por exemplo a unidade de medida que foi no cadastro deste resíduo, ou seja, uma ligação através de chave estrangeira, no banco de dados, na tabela de geração haveria um campo do tipo residuo_id, fazendo a associação do objeto resíduo com a geração. Caso não tenha ficado claro por favor, peço que avise e eu tento explicar de outra maneira.

O que eu acho que esta acontecendo é, o java espera receber algo do tipo “Residuo” como declarado na classe modelo de geração:

@ManyToOne private Residuo residuos;

porém através da interface web, estou mandando uma string como value.

tente assim:

<td><select name="residuos.id"> <option value=""> </option> <c:forEach var="residuo" items="${dao.lista}"> <option value="${residuo.id}">${residuo.descricao}</option> </c:forEach> </select></td>
De acordo com padrões elExpression, a idéia é popular o atributo id dentro de residuos

cara… eu conheço pouco de spring jsp… normalmente eu uso ele com suporte a algum framework, injetando dependencias nele

mas pelo que eu estou percebendo ele está pegando o trecho abaixo e associando o name residuos ao atributo da classe… tenta comentar esse select e ve se o submit vai de boa… se for… o problema é nele…

<td><select name="residuos"> <option value=""> </option> <c:forEach var="residuo" items="${dao.lista}"> <option value="${residuo.id}">${residuo.descricao}</option> </c:forEach> </select></td>[/quote]

Cada resíduo é cadastrado separadamente em uma outra interface, e cada um deles tem sua própria Id, certo, ao passar o o valor ${residuo.id} através do value, ao dar submit o erro é apresentado pois é enviado ao método gravar o valor da id no formato de string. Quando tentei trocar o tipo Residuo para String funcionou perfeitamente o cadastro.

O problema é, deixando como string não há como fazer referência a caracteristicas do resíduo, como por exemplo saber qual a classe do resíduo cadastrado na geração de id 3. Por isso a minha idéia de fazer uso de chave estrangeira, porém não estou me saindo muito bem.

[quote=kaahxd]Cada resíduo é cadastrado separadamente em uma outra interface, e cada um deles tem sua própria Id, certo, ao passar o o valor ${residuo.id} através do value, ao dar submit o erro é apresentado pois é enviado ao método gravar o valor da id no formato de string. Quando tentei trocar o tipo Residuo para String funcionou perfeitamente o cadastro.

O problema é, deixando como string não há como fazer referência a caracteristicas do resíduo, como por exemplo saber qual a classe do resíduo cadastrado na geração de id 3. Por isso a minha idéia de fazer uso de chave estrangeira, porém não estou me saindo muito bem.[/quote]

Você está indo bem… vc testou colocar o name do jeito qeu eu falei?.. o que ele está apontando de erro agora?

Tentei mudar como falou, agora esta assim:

              <td><select name="residuos.id">
              <option value="">&nbsp;</option>
              <c:forEach var="residuo" items="${dao.lista}">
               <option value="${residuo.id}">${residuo.descricao}</option>
               </c:forEach>
               </select>
               </td>

E o erro apresentado:

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: id to load is required for loading
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:681)
	org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

java.lang.IllegalArgumentException: id to load is required for loading
	org.hibernate.event.LoadEvent.<init>(LoadEvent.java:89)
	org.hibernate.event.LoadEvent.<init>(LoadEvent.java:61)
	org.hibernate.impl.SessionImpl.load(SessionImpl.java:974)
	org.hibernate.impl.SessionImpl.load(SessionImpl.java:970)
	org.hibernate.ejb.AbstractEntityManagerImpl.getReference(AbstractEntityManagerImpl.java:567)
	br.com.e2sconsultoria.gerenciamentoe2s.infra.DAO.busca(DAO.java:17)
	br.com.e2sconsultoria.gerenciamentoe2s.dao.ResiduoDAO.getBusca(ResiduoDAO.java:35)
	br.com.e2sconsultoria.gerenciamentoe2s.controller.GeracaoController.gravar(GeracaoController.java:25)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:616)
	org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
	org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
	org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669)
	org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.12 logs.

Bem, pelo menos esse erro é diferente kk

ralphsilver Cara Valeeeeu!!! Sua ideia me deu uma luz do que fazer, a partir deste erro gerado com sua sugestão consegui resolver o problema e com isso consegui fazer funcionar!
A partir desse erro tive que fazer umas adaptações na busca por id e em alguns métodos e funcionou perfeito!

Obrigado mesmo man!

Desculpa não ter respondido antes… mas estive na correria aqui…

Legal!!.. como vc resolveu?..

De boa cara, agora to saindo do trampo p/ faculdade, amanhã pela manhã posto as minhas modificações!

Valeu mais uma vez! até mais

[quote=kaahxd]De boa cara, agora to saindo do trampo p/ faculdade, amanhã pela manhã posto as minhas modificações!

Valeu mais uma vez! até mais[/quote]

Ok… assim que der… põe [RESOLVIDO] no título para o pessoal quando pesquisar a dúvida saber que esse tópico está com problema resolvido