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?