[Vraptor] Conversor

Tenho uma classe de modelo chamada Paciente. Dentro dessa classe, tenho uma lista de convênios:

@ManyToMany(fetch = FetchType.EAGER) private List<Convenio> convenios;
Então criei um Conversor de Convenio:

[code]@Convert(Convenio.class)
public class ConvenioConverter implements Converter {

private final Logger logger = LoggerFactory.getLogger(this.getClass());
private ConvenioDao convenioDao;

public ConvenioConverter(ConvenioDao convenioDao) {
	this.convenioDao = convenioDao;
}

public Convenio convert(String value, Class<? extends Convenio> type,
		ResourceBundle bundle) {
	if (value == null || value.equals("")) {
		return null;
	}

	try {
		return convenioDao.visualizar(Long.parseLong(value));
	} catch (Exception e) {
		logger.error("Erro ao converter Convênio. Valor: " + value, e);
		throw new ConversionError(bundle.getString("is_not_a_valid_value"));
	}
}

}[/code]
Numa certa rota eu recebo um “Paciente”:

@Post("/cadastrar") public void cadastrar(Paciente paciente) { validate(paciente); ... }
E acesso essa rota por javascript:

[code] var url = cadastro.attr(“data-url”);
var data = {
“paciente.nome” : cadastro.find(".nome").val(),
“paciente.cpf” : cadastro.find(".cpf").val(),
“paciente.sexo” : cadastro.find(".sexo").val(),
“paciente.telefone” : cadastro.find(".telefone").val(),
“paciente.celular” : cadastro.find(".celular").val(),
“paciente.convenios[0]” : 1,
“paciente.email” : cadastro.find(".email").val(),
“paciente.senha” : cadastro.find(".senha").val(),
“paciente.confirmarSenha” : cadastro.find(".confirmarSenha").val()
};

		$.post(url, data, function(data) {
			...
		}, "json");[/code]

Porém eu recebo o seguinte erro:

[quote]br.com.caelum.vraptor.http.InvalidParameterException: Exception when trying to instantiate Target(name=paciente, type=class br.com.metamorfosevirtual.models.Paciente)
Caused by: java.lang.IllegalArgumentException: argument type mismatch[/quote]
O que eu achei estranho é que, pra testar, eu criei um novo campo em Paciente:

@Transient private List<Convenio> teste;
E funcionou direitinho. Criou a lista de convênios exatamente como eu esperava. Depois eu desfiz as alterações e tentei fazer um novo teste: apenas renomear o campo “convenios” para “teste” (e alterar no javascript). Aí não deu mais a exceção acima, porém o campo chegava nulo no backend. E o que eu achei mais estranho: o conversor de convênio não era nem chamado. Não entendi nada do que aconteceu. Alguma ideia?

Todos os outros atributos estão sendo preenchidos corretamente?

Você tem um setter para o convenios? Ou construtor?

Ao meu ver, essas classes estão corretas…

Quando eu comento a linha:

chega tudo certinho sim.

Eu tenho um setter pra convenios:

[code] public List getConvenios() {
return convenios;
}

public void setConvenios(List<Convenio> convenios) {
	this.convenios = convenios;
}[/code]

Acho pouco provável que seja isso, mas, faça um teste:

Passe o número como String… Eu costumo passar inteiros e eles funcionam…

Outra coisa, me mostra toda a exception?

Passando string funcionou. Que estranho.
O mais estranho é que, quando eu testei com o nome “teste”, eu testei com inteiro, e não com string. O que será que aconteceu?

Sobre a stack trace, eu não to conseguindo mandar ela completa. Dá erro no GUJ: “Server Internal Error 500”.

Manda só o Caused By inteiro…

Caused by: java.lang.IllegalArgumentException: argument type mismatch at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38) at net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54) at br.com.caelum.iogi.reflection.NewObject$Setter.set(NewObject.java:86) at br.com.caelum.iogi.reflection.NewObject.setProperty(NewObject.java:58) 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:86) ... 50 more

habilita o log de debug do VRaptor e posta aqui o que acontece na requisição problemática.