STRUTS - PROBLEMA ActionForm

4 respostas
E

Bom Dia Pessoal,

Estou desenvolvendo minha 1ª aplicação utilizando Struts !!!!!!

Tenho uma Classe Musica e uma Classe CD. conforme Abaixo :

@Entity
public class Musica {
	
	@Id
	@GeneratedValue
	private int id;
	private String Nome;
	
	@ManyToOne
	private Cd cd;	
	
	
	public int getCodigo() {
		return id;
	}
	public void setCodigo(int codigo) {
		this.id = codigo;
	}
	public String getNome() {
		return Nome;
	}
	public void setNome(String nome) {
		Nome = nome;
	}
                public Cd getCd() {
		return cd;
	}
	public void setCd(Cd cd) {
		this.cd = cd;
	}
}
@Entity
public class Cd {
	@Id
	@GeneratedValue
	private Long id;
	private String titulo;
	private String artista;
	private String genero;

	public Long getId() {
		return id;
	}

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

	public String getTitulo() {
		return titulo;
	}

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

	public String getArtista() {
		return artista;
	}

	public void setArtista(String artista) {
		this.artista = artista;
	}

	public String getGenero() {
		return genero;
	}

	public void setGenero(String genero) {
		this.genero = genero;
	}

}
Como vcs podem ver acima. Minha Classe Musica tem um Atributo tipo CD(relacionamento 1 para N).

estou com um problema para gravar uma musica. tenho uma classe Action, ActionForm e jsp.
Acho que o meu problema e com o atributo tipo Cd... pois eu tenho que gravar só o codigo do CD(tipo int) e não o objeto CD.. mas não sei como eu faço para resolver isso. !!!!!!!!!

segue abaixo os codigos :

ACTION FORM
public class AdicionaMusicaForm extends ActionForm {

	private Musica musica = new Musica();

	public Musica getMusica() {
		return musica;
	}

}
ACTION
public class AdicionaMusicaAction extends Action {

	@Override
	public ActionForward execute(ActionMapping map, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
			

		Session session = new HibernateUtil().getSession();
				
		AdicionaMusicaForm formulario = (AdicionaMusicaForm) form;
			
		Musica musica = formulario.getMusica();
			
		
		session.beginTransaction();		
		session.save(musica);		
		session.getTransaction().commit();
		

		// ok...visualizacao
		return map.findForward("ok");
	}
JSP
<html:html>
	<!--Tags  importadas da taglig do struts-->
	<html:form action="/adicionaMusica"  >	 
		CD:
		<html:select property="musica.cd">
					<html:option value=""> Selecione o CD</html:option>
			  		<html:options collection="listaCds" property="id" labelProperty="titulo"  />
	&lt;/html:select&gt;			<br>					
		Nome
		&lt;html:text property="musica.nome"/&gt;<br/>
				 
			
		&lt;html:submit &gt; Enviar Dados&lt;/html:submit&gt;		
	&lt;/html:form&gt;
&lt;/html:html&gt;

[color=red]ERRO !!!!![/color]

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

exception

javax.servlet.ServletException: BeanUtils.populate
	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125)

root cause

javax.servlet.ServletException: BeanUtils.populate
	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:469)
	org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:50)
	org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:60)
	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125)

root cause

java.lang.IllegalArgumentException: argument type mismatch
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	org.apache.commons.beanutils.PropertyUtils.setSimpleProperty(PropertyUtils.java:1789)
	org.apache.commons.beanutils.PropertyUtils.setNestedProperty(PropertyUtils.java:1684)
	org.apache.commons.beanutils.PropertyUtils.setProperty(PropertyUtils.java:1713)
	org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:1019)
	org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:808)
	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:467)
	org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:50)
	org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:60)
	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125)

ESPERO QUE CONSIGA ME AJUDAR !!!!!!!!

4 Respostas

L

olá emerson.rodrigo,

Na sua action, o objeto Musica tem o objeto CD dentro dele? Se sim, ele tem o atributo id preenchido ou está com apenas titulo, artista e genero?

pq se ele estiver sem id axo q não irá salvar pois o estado desse Objeto CD será transient e aí o contexto de persistência não conseguirá entender.

[]’'sss!!

E

Bom Dia leonickel ,

vc poderia me explicar melhor …

E

caso o objeto CD esteja em branco… como eu faço para setar o id ?? e onde que eu faço isso na minha actionForm o na minha Action ??

L

claro, desculpe…

vamos lah:

na sua action na linha:

Musica musica = formulario.getMusica();

vc está pegando o Objeto Musica correto? Aí de acordo com o mapeamento que vc fez vc indicou que dentro deste objeto Musica existe um outro Objeto chamado CD correto? então na hora de salvar para que as anotações que vc colocou nas suas classes tenham efeito, vc tem q ter um objeto CD com o atributo id preenchido dentro do seu Objeto Musica na hora.

A minha pergunta foi se este objeto CD estava preenchido e se estava com o id setado.

Se não estiver com essas info preenchidas eu recomendo que a chave do CD venha da tela, ou seja, lah no seu jsp no select o value seria a chave e o label poderia ser o titulo, etc…

uma outra abordagem seria na action quando vc for salvar, primeiro a partir do titulo do CD fazer uma consulta ao banco para resgatar o objeto CD e adicioná-lo dentro do seu Musica e aí sim depois tentar salvar o objeto Musica.

Espero que agora tenha clareado as idéias :smiley:

[]'ssss!!!

Criado 23 de novembro de 2007
Ultima resposta 23 de nov. de 2007
Respostas 4
Participantes 2