[Vraptor] Conversor

7 respostas
G
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:
@Convert(Convenio.class)
public class ConvenioConverter implements Converter<Convenio> {

	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"));
		}
	}

}
Numa certa rota eu recebo um "Paciente":
@Post("/cadastrar")
	public void cadastrar(Paciente paciente) {
		validate(paciente);
		...
	}
E acesso essa rota por javascript:
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");
Porém eu recebo o seguinte erro:
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
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?

7 Respostas

Rafael_Guerreiro

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…

G
Quando eu comento a linha:
"paciente.convenios[0]" : 1,
chega tudo certinho sim. Eu tenho um setter pra convenios:
public List<Convenio> getConvenios() {
		return convenios;
	}

	public void setConvenios(List<Convenio> convenios) {
		this.convenios = convenios;
	}
Rafael_Guerreiro

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?

G

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”.

Rafael_Guerreiro

Manda só o Caused By inteiro…

G

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

Lucas_Cavalcanti

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

Criado 7 de janeiro de 2014
Ultima resposta 18 de jan. de 2014
Respostas 7
Participantes 3