Seam Erro: IllegalArgumentException

Pessoal, estou com o seguinte problema:

Estou aprendendo a criar projeto usando o Seam com o JbossTools e Jboss AS, então estou fazendo pequenos projetinhos pra eu me entender com ele.
Dessa vez estou criando um sisteminha de e-mail, tenho contatos e mensagens. cada mensagem possui um remetente(contato).

O problema é que quando passo o contato pela view ele dá esse erro:

/criarMensagem.xhtml @16,52 value="#{mensagem.remetente}": java.lang.IllegalArgumentException: argument type mismatch /criarMensagem.xhtml

O componente está esperando um obj Contato e eu passo um obj Contato pela view. No meu entendimento era pra funcionar… Estou fazendo algo errado?

Segue o código:

Mensagem

@Entity
@Name("mensagem")
@Table(name = "mensagem")
public class Mensagem implements Serializable{

	private static final long serialVersionUID = 6049667375225998846L;
	
	@Id 
	@GeneratedValue
	private Long id;
	
	@Temporal(TemporalType.TIMESTAMP)
	private Date dt_registro;
	
	@ManyToOne
	@JoinColumn
	private Contato remetente; //aqui entra o remetente

//resto do código

ContatoViewAction (gera a lista com os contatos) - está fazendo o papel dela numa boa…

@Stateful
@Name("contatoView")
@Scope(ScopeType.SESSION)
public class ContatoViewAction implements ContatoView {

	@PersistenceContext
	public EntityManager em;
	
	@DataModel
	List<Contato> contatos; //essa é a lista de contatos que a view carrega

A View

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:rich="http://richfaces.org/rich"
	xmlns:s="http://jboss.com/products/seam/taglib"
	template="/layout/template.xhtml">

	<ui:define name="body">

		<h:messages showDetail="true" />
		<h:form>
			<h:panelGrid columns="2">
				
<!-- aqui o problema -->
                <h:outputText value="Remetente" />
				<h:selectOneMenu value="#{mensagem.remetente}">
					<s:selectItems value="#{contatos}" var="c" label="#{c.nome}"
						noSelectionLabel="Selecione..." />
				</h:selectOneMenu>
<!-- aqui o problema -->

				<h:outputText value="Destinatário(s)" />
			</h:panelGrid>
			
			<rich:pickList value="#{mensagem.destinatarios}">
				<s:selectItems value="#{contatos}" var="contato"
					label="#{contato.nome}" />
			</rich:pickList>

			<h:panelGrid columns="2">
				<h:outputText value="Assunto" />
				<h:inputText value="#{mensagem.assunto}" />

				<h:outputText value="Mensagem" />
				<rich:editor value="#{mensagem.texto}" />

				<h:commandButton action="#{contatoMsgEditor.create}" value="Enviar" />
				<h:commandButton action="/criarEmail.xhtml" value="Cancelar" />
			</h:panelGrid>
		</h:form>
	</ui:define>
</ui:composition>

13:38:45,041 ERROR [STDERR] 13/04/2010 13:38:45 javax.faces.component.UIInput updateModel SEVERE: /criarMensagem.xhtml @16,52 value="#{mensagem.remetente}": java.lang.IllegalArgumentException: argument type mismatch java.lang.IllegalArgumentException: argument type mismatch at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.el.BeanELResolver.setValue(BeanELResolver.java:108) at javax.el.CompositeELResolver.setValue(CompositeELResolver.java:68) at com.sun.faces.el.FacesCompositeELResolver.setValue(FacesCompositeELResolver.java:100) at org.jboss.el.parser.AstPropertySuffix.setValue(AstPropertySuffix.java:73) at org.jboss.el.parser.AstValue.setValue(AstValue.java:84) at org.jboss.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:249) at com.sun.facelets.el.TagValueExpression.setValue(TagValueExpression.java:93) at javax.faces.component.UIInput.updateModel(UIInput.java:771) at javax.faces.component.UIInput.processUpdates(UIInput.java:703) at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1081) at javax.faces.component.UIForm.processUpdates(UIForm.java:261) at org.ajax4jsf.component.AjaxViewRoot$2.invokeContextCallback(AjaxViewRoot.java:416) at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:238) at org.ajax4jsf.component.AjaxViewRoot.processUpdates(AjaxViewRoot.java:432) at com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83) at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:368) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:495) at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 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:230) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446) at java.lang.Thread.run(Thread.java:619)

Alguém?

Tente usar o convertEntity. Comigo deu certo.


<rich:pickList value="#{mensagem.destinatarios}">  
          <s:selectItems value="#{contatos}" var="contato"          label="#{contato.nome}" />
<s:convertEntity />	  
</rich:pickList>  

Muito obrigado! fez diferença, adicionei essa tag tanto no destinatario quanto no remetente, agora ele tá dando:

“value is not valid value is not valid”

e não dá o submit =/

oi puka! obrigado pela ajuda.

tentei o q vc falou mas nao deu certo… mas caiu a ficha aqui em uma coisa, a lista com os contatos que eu carrego no combo do remetente e no picklist do destinatario eu pego da classe Contato, e essa lista tá anotada como @DataModel, sendo que, pelo que tenho visto, usa-se uma outra propriedade anotada como @DataModelSelection, que vai receber o objeto selecionado no datamodel

public class ContatoViewAction implements ContatoView {

	@PersistenceContext
	public EntityManager em;
	
	@DataModel
	List<Contato> contatos; //a lista
	
	@DataModelSelection
	Contato selecionado;     //e um objeto que vai pegar a seleção da lista

mas como que eu faço isso na view?

<h:outputText value="Remetente" />
				<h:selectOneMenu value="#{mensagem.remetente}">
					<s:selectItems value="#{contatos}" var="c" label="#{c.nome}"     <!-- o datamodel vem pra cá e como que faço o objeto selecionado ser atribuido ao datamodelselection "Selecionado"?? -->
						noSelectionLabel="Selecione..." />
					<s:convertEntity />
				</h:selectOneMenu>

				<h:outputText value="Destinatário(s)" />
			</h:panelGrid>
			
			<rich:pickList value="#{mensagem.destinatarios}">
				<s:selectItems value="#{contatos}" var="contato"
					label="#{contato.nome}" />
					<s:convertEntity />
			</rich:pickList>

Quando dá o submit ele chama o create daqui:


package email.web;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.RaiseEvent;
import org.jboss.seam.annotations.Scope;

import email.model.Mensagem;

@Stateless
@Name("contatoMsgEditor")
@Scope(ScopeType.SESSION)
public class ContatoMsgEditorAction implements ContatoMsgEditor{

	
	@PersistenceContext
	private EntityManager em;
	
	@Out(required = false)
	private Mensagem msg;
	
	@RaiseEvent("atualizaListaContato")
	public String carregar()
	{
		return "/criarMensagem.xhtml";
	}
	
	public String create()
	{
		em.persist(msg);		
		return "/contatoMsg.xhtml";
	}
	
}