Galera, tenho uma controladora que tem um metodo assim:
@Post("/whatever")
public void novo(List<Referencia> referencias){
}
Porém, como referecia pode ser de tres tipos distintos, eu fiz uma herança da seguinte maneira
ReferenciaBancaria extends Referencia
ReferenciaPessoal extends Referencia
ReferenciaComercial extends Referencis
Por isso eu tenho um converter assim:
@ApplicationScoped
@Convert(Referencia.class)
public class ReferenciaConverter implements Converter<Referencia>{
@Override
public Referencia convert(String valor, Class<? extends Referencia> arg1, ResourceBundle arg2) {
if("Pessoal".equalsIgnoreCase(valor))
return new ReferenciaPessoal();
if("Comercial".equalsIgnoreCase(valor))
return new ReferenciaComercial();
if("Bancaria".equalsIgnoreCase(valor))
return new ReferenciaBancaria();
throw new RuntimeException("Tipo de referencia desconhecido");
}
}
Entao minha duvida, é como expressar no JSP esta relação… se eu coloco dessa maneira (abaixo) ele chega no Converter mas quando o VRaptor tenta popular a lista (eu suponho) eu tenho uma excecao (mais abaixo ainda)!!!
<input type="hidden" name="referencias[]" value="pessoal"/>
<prv:linha id="linhaReferenciaPessoalNome" label="Nome">
<prv:campoDeTexto name="referencias.nome" type="text" id="contatoReferenciaPessoalNome" obrigatorio="true"/>
</prv:linha>
<prv:linha id="linhaReferenciaPessoalTelefone" label="Telefone">
<prv:campoDeTexto name="referencias.telefone.numero" type="text" id="contatoReferenciaPessoalTelefone" obrigatorio="true" mascara="(99) 9999-9999" />
</prv:linha>
Excecao:
25/04/2012 13:04:24 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [default] in context with path [/prv3] threw exception
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at br.com.caelum.vraptor.http.ognl.ListAccessor.setProperty(ListAccessor.java:68)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2225)
at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
at ognl.SimpleNode.setValue(SimpleNode.java:279)
at ognl.Ognl.setValue(Ognl.java:737)
at ognl.Ognl.setValue(Ognl.java:783)
Alguem saberia como tratar este tipo de caso??? Eu ja tentei de outras maneiras, mas se eu tiro o [] do hidden referencias ele nem chega no Converter!!!
EDIT: VRaptor 3.4.0