Segue o debug do Vraptor:
12:35:01,032 DEBUG [VRaptor ] VRaptor received a new request
12:35:01,032 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
12:35:01,032 DEBUG [DefaultResourceTranslator] trying to access /cadastrar-medico
12:35:01,033 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: MedicoController.cadastrar(Medico, String, UploadedFile, List, List)]
12:35:01,033 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor HibernateInterceptor
12:35:01,033 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
12:35:01,036 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor CommonsUploadMultipartInterceptor
12:35:01,036 INFO [CommonsUploadMultipartInterceptor] Request contains multipart data. Try to parse with commons-upload.
12:35:01,040 DEBUG [CommonsUploadMultipartInterceptor] Using repository C:\Users\Guto\AppData\Local\Temp for file upload
12:35:01,081 DEBUG [CommonsUploadMultipartInterceptor] Found 19 attributes in the multipart form submission. Parsing them.
12:35:01,081 DEBUG [CommonsUploadMultipartInterceptor] A file field was empty: foto
12:35:01,081 DEBUG [CommonsUploadMultipartInterceptor] medico is a field
12:35:01,082 DEBUG [CommonsUploadMultipartInterceptor] medico.nome is a field
12:35:01,082 DEBUG [CommonsUploadMultipartInterceptor] medico.cpf is a field
12:35:01,082 DEBUG [CommonsUploadMultipartInterceptor] medico.crm is a field
12:35:01,082 DEBUG [CommonsUploadMultipartInterceptor] medico.crm.numero is a field
12:35:01,083 DEBUG [CommonsUploadMultipartInterceptor] convenios is a field
12:35:01,083 DEBUG [CommonsUploadMultipartInterceptor] convenios is a field
12:35:01,083 DEBUG [CommonsUploadMultipartInterceptor] medico.endereco is a field
12:35:01,083 DEBUG [CommonsUploadMultipartInterceptor] medico.endereco.endereco is a field
12:35:01,083 DEBUG [CommonsUploadMultipartInterceptor] medico.endereco.cidade is a field
12:35:01,083 DEBUG [CommonsUploadMultipartInterceptor] medico.endereco.cidade.nome is a field
12:35:01,083 DEBUG [CommonsUploadMultipartInterceptor] medico.telefonePrincipal is a field
12:35:01,083 DEBUG [CommonsUploadMultipartInterceptor] medico.telefoneSecundario is a field
12:35:01,083 DEBUG [CommonsUploadMultipartInterceptor] medico.celular is a field
12:35:01,083 DEBUG [CommonsUploadMultipartInterceptor] medico.uri is a field
12:35:01,084 DEBUG [CommonsUploadMultipartInterceptor] medico.email is a field
12:35:01,084 DEBUG [CommonsUploadMultipartInterceptor] medico.senha is a field
12:35:01,084 DEBUG [CommonsUploadMultipartInterceptor] confirmarSenha is a field
12:35:01,090 DEBUG [VRaptorRequest ] Setting medico with []
12:35:01,090 DEBUG [VRaptorRequest ] Setting medico.nome with []
12:35:01,090 DEBUG [VRaptorRequest ] Setting medico.cpf with []
12:35:01,090 DEBUG [VRaptorRequest ] Setting medico.crm with []
12:35:01,090 DEBUG [VRaptorRequest ] Setting medico.crm.numero with []
12:35:01,090 DEBUG [VRaptorRequest ] Setting convenios with [3, 2]
12:35:01,090 DEBUG [VRaptorRequest ] Setting medico.endereco with []
12:35:01,091 DEBUG [VRaptorRequest ] Setting medico.endereco.endereco with []
12:35:01,091 DEBUG [VRaptorRequest ] Setting medico.endereco.cidade with []
12:35:01,091 DEBUG [VRaptorRequest ] Setting medico.endereco.cidade.nome with []
12:35:01,091 DEBUG [VRaptorRequest ] Setting medico.telefonePrincipal with []
12:35:01,091 DEBUG [VRaptorRequest ] Setting medico.telefoneSecundario with []
12:35:01,091 DEBUG [VRaptorRequest ] Setting medico.celular with []
12:35:01,091 DEBUG [VRaptorRequest ] Setting medico.uri with []
12:35:01,091 DEBUG [VRaptorRequest ] Setting medico.email with []
12:35:01,091 DEBUG [VRaptorRequest ] Setting medico.senha with []
12:35:01,091 DEBUG [VRaptorRequest ] Setting confirmarSenha with []
12:35:01,091 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
12:35:01,091 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
12:35:01,091 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor DaoInterceptor
12:35:01,094 DEBUG [DefaultResult ] including attribute conveniosList: [Amil, Bradesco Saúde, Dix, Golden Cross, Unimed]
12:35:01,095 DEBUG [DefaultResult ] including attribute convenios: {Amil=false, Bradesco Saúde=false, Dix=false, Golden Cross=false, Unimed=false}
12:35:01,095 DEBUG [IogiParametersProvider] IogiParametersProvider is up
12:35:01,095 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
12:35:01,095 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for MedicoController.cadastrar(Medico, String, UploadedFile, List, List) as [medico, confirmarSenha, foto, especialidades, convenios]
12:35:01,096 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for MedicoController.cadastrar(Medico, String, UploadedFile, List, List) as [medico, confirmarSenha, foto, especialidades, convenios]
12:35:01,097 DEBUG [IogiParametersProvider] getParametersFor() called with parameters Parameters(Parameter(medico.endereco.endereco -> ), Parameter(medico.endereco.cidade.nome -> ), Parameter(medico.crm.numero -> ), Parameter(medico.nome -> ), Parameter(medico.uri -> ), Parameter(medico.email -> ), Parameter(medico.telefoneSecundario -> ), Parameter(medico.endereco.cidade -> ), Parameter(medico.crm -> ), Parameter(medico.cpf -> ), Parameter(medico.telefonePrincipal -> ), Parameter(medico -> ), Parameter(medico.endereco -> ), Parameter(medico.celular -> ), Parameter(medico.senha -> ), Parameter(confirmarSenha -> ), Parameter(convenios -> 3), Parameter(convenios -> 2)) and targets [Target(name=medico, type=class br.com.metamorfosevirtual.models.Medico), Target(name=confirmarSenha, type=class java.lang.String), Target(name=foto, type=interface br.com.caelum.vraptor.interceptor.multipart.UploadedFile), Target(name=especialidades, type=interface java.util.List), Target(name=convenios, type=interface java.util.List)].
12:35:01,112 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: MedicoController.cadastrar(Medico, String, UploadedFile, List, List)] are [br.com.metamorfosevirtual.models.Medico@1f, null, null, null, {Amil=false, Bradesco Saúde=false, Dix=false, Golden Cross=false, Unimed=false}]
12:35:01,112 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
12:35:01,112 DEBUG [ExecuteMethodInterceptor] Invoking MedicoController.cadastrar(Medico, String, UploadedFile, List, List)
12:35:01,113 DEBUG [DefaultExceptionMapper] find for exception class java.lang.IllegalArgumentException
Jan 31, 2014 12:35:01 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [default] in context with path [/marque-agora] threw exception
br.com.caelum.vraptor.InterceptionException: java.lang.IllegalArgumentException: argument type mismatch
at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:87)
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.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:96)
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.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.metamorfosevirtual.interceptors.DaoInterceptor.intercept(DaoInterceptor.java:35)
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:67)
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.interceptor.multipart.CommonsUploadMultipartInterceptor.intercept(CommonsUploadMultipartInterceptor.java:138)
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.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.metamorfosevirtual.interceptors.HibernateInterceptor.intercept(HibernateInterceptor.java:30)
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:93)
at br.com.caelum.vraptor.ioc.guice.GuiceProvider.provideForRequest(GuiceProvider.java:82)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:99)
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:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
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:1002)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
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: 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 br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
... 50 more
Pelo que eu entendi, o problema é o seguinte: quando ele chama o DaoInterceptor, eu crio um atributo chamado “convenios”. Repara que tem 2 parâmetros que eu mandei com o nome “convenios”. O IOGI consegue lidar com eles e monta certinho os parâmetros (é uma lista de convênios). Depois ele diz que chama meu método: Invoking MedicoController.cadastrar(Medico, String, UploadedFile, List, List). Mas eu coloco um breakpoint na primeira linha do meu controller e não para lá. Ou seja, eu nem chego a validar nada. Acredito que o Vraptor esteja jogando os parâmetros do request na lista de atributos mesmo sem validação. Aí o conflito que dá é porque eu já tinha colocado um atributo “convenios” que era do tipo Map e ele tenta colocar um atributo “convenios” do tipo List. Aí dá “argument type mismatch”. Acho que é isso…