VRaptor Unable to find converter

Ae pessoal so novo aqui no forum to com um problema se vocês puderem me ajudar.

Seguinte

Tenho 3 class

Cliente {

@OneToOne
Pessoa pessoa;
}

Pessoa {
@OneToOne
Endereco endereco;
}

Endereco {

}

JSP:

quando mando salvar ele da Unable to find converter pacote.Endereco

Alguma ideia?

Pode mostrar todo o seu JSP?

segue o JSP completo

<%@taglib uri=“http://java.sun.com/jsp/jstl/fmt” prefix=“fmt”%>
<%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
<%@taglib tagdir="/WEB-INF/tags" prefix=“sm”%>

<%@ page language=“java” contentType="text/html; charset=ISO-8859-1"
pageEncoding=“ISO-8859-1”%>

Página inicial
<%@ include file="../header.jsp"%>

<div class="container-fluid">
	<div class="row-fluid">
		<div class="span2">
			<%@ include file="../menuLateral.jsp"%>
		</div>
		<div class="span10">
			<div class="container-fluid">
				<div class="row-fluid">
					<div class="Cadastro-form">
						<h4>Cadastro de cliente</h4>
						<form action="efetuaCadastro" method="post">
							<fieldset>
								<input type="hidden" name="cliente.pessoa" value="PessoaFisica" />
								<div class="clearfix">
									<div class="span4">
										<label>Nome</label> <input type="text" class="span12"
											name="cliente.pessoa.nome">
									</div>
									<div class="span2">
										<label>CPF</label> <input type="text"
											name="cliente.pessoa.registroNacional">
									</div>

									<div class="span2">
										<label>RG</label> <input type="text"
											name="cliente.pessoa.documentoId">
									</div>
								</div>

								<ul class="nav nav-tabs" id="enderecoTab">
									<li class="active"><a href="#Endereco" data-toggle="tab">Endereço</a></li>
									<li><a href="#EnderecoFiscal" data-toggle="tab">Endereço
											Fiscal</a></li>
									<li><a href="#EnderecoEntrega" data-toggle="tab">Endereço
											Entrega</a></li>
								</ul>

								<div class="tab-content">
									<div class="tab-pane active" id="Endereco">

										<div class="clearfix">
											<div class="span2">
												<label>CEP</label> <input type="text"
													name="cliente.pessoa.endereco.cep">
											</div>
											<div class="span6">
												<label>Endereço</label> <input type="text" class="span12"
													name="cliente.pessoa.endereco.endereco">
											</div>
										</div>

										<div class="clearfix">
											<div class="span2">
												<label>Bairro</label> <input type="text"
													name="cliente.pessoa.endereco.bairro">
											</div>
											<div class="span2">
												<label>Estado</label> <input type="text"
													name="cliente.pessoa.endereco.estado">
											</div>

											<div class="span2">
												<label>Cidade</label> <input type="text"
													name="cliente.pessoa.endereco.cidade">
											</div>
										</div>

									</div>

									<div class="tab-pane" id="EnderecoFiscal">

										<div class="clearfix">
											<div class="span2">
												<label>CEP</label> <input type="text"
													name="cliente.pessoa.enderecoFiscal.cep">
											</div>
											<div class="span6">
												<label>Endereço</label> <input type="text" class="span12"
													name="cliente.pessoa.enderecoFiscal.endereco">
											</div>
										</div>

										<div class="clearfix">
											<div class="span2">
												<label>Bairro</label> <input type="text"
													name="cliente.pessoa.enderecoFiscal.bairro">
											</div>
											<div class="span2">
												<label>Estado</label> <input type="text"
													name="cliente.pessoa.enderecoFiscal.estado">
											</div>

											<div class="span2">
												<label>Cidade</label> <input type="text"
													name="cliente.pessoa.enderecoFiscal.cidade">
											</div>
										</div>

									</div>

									<div class="tab-pane" id="EnderecoEntrega">

										<div class="clearfix">
											<div class="span2">
												<label>CEP</label> <input type="text"
													name="cliente.pessoa.enderecoEntrega.cep">
											</div>
											<div class="span6">
												<label>Endereço</label> <input type="text" class="span12"
													name="cliente.pessoa.enderecoEntrega.endereco">
											</div>
										</div>

										<div class="clearfix">
											<div class="span2">
												<label>Bairro</label> <input type="text"
													name="cliente.pessoa.enderecoEntrega.bairro">
											</div>
											<div class="span2">
												<label>Estado</label> <input type="text"
													name="cliente.pessoa.enderecoEntrega.estado">
											</div>

											<div class="span2">
												<label>Cidade</label> <input type="text"
													name="cliente.pessoa.enderecoEntrega.cidade">
											</div>
										</div>

									</div>
								</div>





								<button class="btn" type="submit">Cadastrar</button>
							</fieldset>
						</form>
					</div>
				</div>
			</div>
		</div>
	</div>
</div>

<%@ include file="../footer.jsp"%>
<script
	src="${pageContext.request.contextPath}/resource/js/jquery-1.9.1.min.js"></script>
<script
	src="${pageContext.request.contextPath}/resource/js/jquery-ui.js"></script>
<script
	src="${pageContext.request.contextPath}/resource/bootstrap/js/bootstrap.js"></script>
<script
	src="${pageContext.request.contextPath}/resource/bootstrap/js/bootstrap-combobox.js"></script>
<script type="text/javascript">
	$(document).ready(function() {
		$('.combobox').combobox()
	});
</script>

Dá uma olhada quais parametros estão indo na requisição, tipo num firebug ou developer tools, e veja se algum deles termina em um Endereço endereco ao invés da String endereco

Desculpe a ignorância mais é que eu comecei programa web agora então eu instalei o Firebug mas não sei como faço pra ver os parâmetros na requisição

tem a aba Net (ou Rede se estiver em portugues). Faça a requisição, abra a Net e clique na requisição. Lá vai aparecer os cabeçalhos e os parametros.

cliente.pessoa=PessoaFisica
cliente.pessoa.documentoId=
cliente.pessoa.endereco.bairro=st
cliente.pessoa.endereco.cep=0000000
cliente.pessoa.endereco.cidade=sao paulo
cliente.pessoa.endereco.endereco=rua teste
cliente.pessoa.endereco.estado=sp
cliente.pessoa.enderecoEntrega.bairro=
cliente.pessoa.enderecoEntrega.cep=
cliente.pessoa.enderecoEntrega.cidade=
cliente.pessoa.enderecoEntrega.endereco=
cliente.pessoa.enderecoEntrega.estado=
cliente.pessoa.enderecoFiscal.bairro=
cliente.pessoa.enderecoFiscal.cep=
cliente.pessoa.enderecoFiscal.cidade=
cliente.pessoa.enderecoFiscal.endereco=
cliente.pessoa.enderecoFiscal.estado=
cliente.pessoa.nome=henrique
cliente.pessoa.registroNacional=

assim estão os parametros

vc tem converter pra Pessoa? Algum dos parâmetross que terminam em .endereco são um Endereço ao invés de String?

esse é o converter de pessoa
public class PessoaConverter implements Converter {

@Override
public Pessoa convert(String valor, Class<? extends Pessoa> arg1, ResourceBundle arg2) {
	System.out.println(valor);
	if ("PessoaFisica".equals(valor))
		return new PessoaFisica();
	else if ("PessoaJuridica".equals(valor))
		return (Pessoa) new PessoaJuridica();
	else
		throw new RuntimeException("Tipo nao pode ser diferente de PessoaFisica ou PessoaJuridica");
}

}

Os parâmetros que terminam em endereço são String e tmb já tentei mudar o nome de endereço para logradouro da o mesmo erro.

pode me mandar o erro direitinho, com a stacktrace, por favor?

e coloque os códigos entre e

br.com.caelum.vraptor.http.InvalidParameterException: Exception when trying to instantiate Target(name=cliente, type=class br.com.hll.model.entidades.Cliente)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.handleException(VRaptorInstantiator.java:95)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.handleException(VRaptorInstantiator.java:97)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.instantiate(VRaptorInstantiator.java:87)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.instantiate(VRaptorInstantiator.java:80)
at br.com.caelum.vraptor.http.iogi.IogiParametersProvider.instantiateOrAddError(IogiParametersProvider.java:80)
at br.com.caelum.vraptor.http.iogi.IogiParametersProvider.instantiateParameters(IogiParametersProvider.java:73)
at br.com.caelum.vraptor.http.iogi.IogiParametersProvider.getParametersFor(IogiParametersProvider.java:63)
at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:126)
at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:83)
at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:51)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: br.com.caelum.vraptor.VRaptorException: Unable to find converter for br.com.hll.model.Endereco
at br.com.caelum.vraptor.core.DefaultConverters.to(DefaultConverters.java:59)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator$VRaptorTypeConverter.converterForTarget(VRaptorInstantiator.java:158)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator$VRaptorTypeConverter.setPropertiesAfterConversions(VRaptorInstantiator.java:143)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator$VRaptorTypeConverter.instantiate(VRaptorInstantiator.java:134)
at br.com.caelum.iogi.reflection.NewObject.setProperty(NewObject.java:57)
at br.com.caelum.iogi.reflection.NewObject.populateProperties(NewObject.java:51)
at br.com.caelum.iogi.reflection.NewObject.valueWithPropertiesSet(NewObject.java:41)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator$VRaptorTypeConverter.setPropertiesAfterConversions(VRaptorInstantiator.java:145)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator$VRaptorTypeConverter.instantiate(VRaptorInstantiator.java:134)
at br.com.caelum.iogi.MultiInstantiator.instantiate(MultiInstantiator.java:20)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.instantiate(VRaptorInstantiator.java:85)
at br.com.caelum.iogi.reflection.NewObject.setProperty(NewObject.java:57)
at br.com.caelum.iogi.reflection.NewObject.populateProperties(NewObject.java:51)
at br.com.caelum.iogi.reflection.NewObject.valueWithPropertiesSet(NewObject.java:41)
at br.com.caelum.iogi.ObjectInstantiator.instantiate(ObjectInstantiator.java:30)
at br.com.caelum.iogi.MultiInstantiator.instantiate(MultiInstantiator.java:20)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.instantiate(VRaptorInstantiator.java:85)
… 47 more

alguma ideia?

vc tá recebendo algum parametro na url? tá recebendo alguma coisa pelos construtores dos modelos?

Não to recebendo nada na URL e nem no contrutor

Essa é minha class Pessoa (já tentei tirar o abstract da o mesmo erro)

@Entity
public abstract class Pessoa extends EntityModel{

	@NotEmpty
	String nome;
	
	@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)	
	Endereco enderecoFiscal;	
	@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	Endereco enderecoEntrega;	
	@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	Endereco endereco;
	
	@OneToMany(mappedBy="pessoa",targetEntity = Contato.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)	
	List<Contato> contato;	
	
	String registroNacional;
	String documentoId;
	
	@Temporal(TemporalType.DATE) @DateTimeFormat(pattern="dd/MM/yyyy")
	Calendar dataNascimento;	
	
	@NotEmpty
	String tipoPessoa;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Endereco getEnderecoFiscal() {
		return enderecoFiscal;
	}

	public void setEnderecoFiscal(Endereco enderecoFiscal) {
		this.enderecoFiscal = enderecoFiscal;
	}

	public Endereco getEnderecoEntrega() {
		return enderecoEntrega;
	}

	public void setEnderecoEntrega(Endereco enderecoEntrega) {
		this.enderecoEntrega = enderecoEntrega;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public List<Contato> getContato() {
		return contato;
	}

	public void setContato(List<Contato> contato) {
		this.contato = contato;
	}

	public String getRegistroNacional() {
		return registroNacional;
	}

	public void setRegistroNacional(String registroNacional) {
		this.registroNacional = registroNacional;
	}

	public String getDocumentoId() {
		return documentoId;
	}

	public void setDocumentoId(String documentoId) {
		this.documentoId = documentoId;
	}

	public Calendar getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(Calendar dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	public String getTipoPessoa() {
		return tipoPessoa;
	}

	public void setTipoPessoa(String tipoPessoa) {
		this.tipoPessoa = tipoPessoa;
	}	
	
}

Essa é minha class de PessoaFisica ( tenho um converter)

public class PessoaFisica extends Pessoa{

	public PessoaFisica() {
		tipoPessoa = "Física";
	}
}

Essa é a class cliente

@Entity
public class Cliente extends EntityModel{	
		
	@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)	
	private Pessoa pessoa;
	
	@OneToOne	
	private Usuario usuario;
	
	@OneToOne
	private Empresa empresa;

	@OneToMany(mappedBy = "cliente", targetEntity = Veiculo.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List<Veiculo> veiculo;	
	
	public Pessoa getPessoa() {
		return pessoa;
	}

	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Empresa getEmpresa() {
		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}
	
	public List<Veiculo> getVeiculo() {
		return veiculo;
	}

	public void setVeiculo(List<Veiculo> veiculo) {
		this.veiculo = veiculo;
	}	
	
}

se eu colocar o Endereco dentro de cliente funciona normal mas se deixo ele dentro da class Pessoa da o erro.

se vc não passa nenhum dado de endereço no request funciona? tenta ir tirando os inputs até ver o problemático.

tenta receber direto Pessoa no controller (e mudar os parametros de acordo)

Heranças adicionam complexidades bem grandes na hora de criar os objetos, sempre aparece um caso em que não funciona =S A gente só precisa conseguir isolar pra conseguir resolver.

Se eu tiro todos funciona.

Se eu tiro o cliente deixo a pessoa direto funciona tmb.

Se eu tiro a pessoa coloco o endereço na pessoa Funciona tmb.

Com todos os objetos mesmo deixando somente 1 campo do endereço não funciona

Por enquanto o que vc pode fazer:

public void seuMetodoDoController(Cliente cliente, Pessoa pessoa) {
   cliente.setPessoa(pessoa);
   //resto da sua lógica
}

daí vc recebe os parametros de pessoa separadamente, que vc diz que funciona e depois vc só seta no cliente.

abre por favor uma issue sobre isso em:

Blz vo tenta aqui.

Mais uma dúvida.

Dentro de Pessoa eu tenho uma List contato;

no Jsp tenho uma table e um botão “Adiciona Contato” que exibe um bootstrap modal, eu queria que toda vez que clica-se no botão, inserir uma linha na table e adicionar um contato na lista , Ai no final quando clicar no botão salvar ele salva o Cliente com Pessoa e seus respectivos contatos.

Ou seja como eu faço pra toda vez que ele clicar no botão inserir um Objeto contato em pessoa mas não persistir?

pq vc não faz isso via javascript, só modificando o html?

é bem fácil fazer isso usando o JQuery, por exemplo.

daí é só gerar os nomes dos inputs com os índices da lista corretamente tipo “pessoa.contatos[0].propriedade”