Problema Struts + ArrayList

to com um problema aqui
seguinte
tenho um actionForm e cada propriedade tem seus getters e setters:

public class Concurso extends ActionForm {
     private String spi;
     private ArrayList<Fase> alFases = new ArrayList<Fase>();

e tenho uma jsp com o seguinte trecho:

<html:select property="alFases">
    <html:optionsCollection name="concurso" property="alFases"  label="id" value="id"/>
</html:select>

mas quando eu dou um submit neste form, eu recebi a seguinte excecao:

javax.servlet.ServletException: BeanUtils.populate
	at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:497)
	at org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:798)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:205)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1158)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2417)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:193)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:781)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:549)
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:589)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:666)
	at java.lang.Thread.run(Unknown Source)


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 org.apache.commons.beanutils.PropertyUtils.setSimpleProperty(PropertyUtils.java:1656)
	at org.apache.commons.beanutils.PropertyUtils.setNestedProperty(PropertyUtils.java:1551)
	at org.apache.commons.beanutils.PropertyUtils.setProperty(PropertyUtils.java:1580)
	at org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:919)
	at org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:726)
	at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:495)
	at org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:798)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:205)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1158)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2417)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:193)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:781)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:549)
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:589)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:666)
	at java.lang.Thread.run(Unknown Source)

Eu nunca utilizei um ActionForm antes que possui um ArrayList como propriedade
tenho praticamente certeza que é aqui que está o problema, deve ser algo do tipo ele estar esperando um array e estar recebendo apenas um valor
mas não sei como solucionar este problema
alguém tem alguma ideia?

O problema é exatamente o que vc falou, veja:

<html:select property="alFases"> <html:optionsCollection name="concurso" property="alFases" label="id" value="id"/> </html:select>

Vc está passando o resultado do html:select para alFases, um objeto ArrayList, mas está enviando id, que deve ser um int ou Integer.

<html:select property="alFases">
property é o atributo do ActionForm que será preenchido com o resultado do html:select.

<html:optionsCollection name="concurso" property="alFases" label="id" value="id"/>
value é o atributo de um objeto da lista name.property que será enviado como resultado do html:select.

label é o atributo de um objeto da lista name.property que será exibido para o usuário na combobox gerada pelo html:select.

Qualquer coisa estamos aí. :wink:

mas como eu resolvo este problema?
eu quero mandar um objeto Concurso pra action
Como eu faço pra que a jsp seja compatível com o ArrayList do Concurso?

Porque você não envia o atributo id da fase?

abraços,

não entendi muito bem oq vc disse cara
basicamente o que eu tenho é uma jsp que utiliza 2 actions
na jsp eu tenho 2 selects: um que mostra o nome dos concursos e um que é para escolher a fase do concurso
quando o cara seleciona o nome de um concurso, eu uso o “onchange” do select para mandar pra uma action que vai listar todas as fases que esse concurso tem e vai voltar para a mesma jsp, preenchendo o select de fases
e tem uma action que é executada quando se dá submit, para pegar o concurso escolhido e a fase deste concurso selecionada
não estou sabendo direito como implementar isto com strtus, ja que ele não aceita um arraylist a partir de um select

Entendi, eu falei errado, nao era id da fase, era id do concurso. Vc pode fazer com q o select do concurso envie o id do concurso correspondente. Sabendo o id do concurso vc consegue definir o concurso e carrega o outro select com as fases desse concurso.

abraços,

sim
é isto o que eu fiz
o problema é que ele tenta passar um id da fase pro ActionForm da action, sendo que o atributo fases de Concurso é um ArrayList
o struts não sabe converter String em ArrayList, este é o problema, então eu recebo um BeanUtil.popolate() exception

Então, faça o seguinte:

<html:select property="idFase"> <html:optionsCollection name="" property="alFases" label="id" value="id"/> </html:select>

No property do html:select passe o id da fase ao invés do ArrayList (se não existir um atributo para isso crie, algo como String idFase, por exemplo). Faça o mesmo para o outro html:select, preenchido com uma lista de concurso e que retorne um idConcurso.

abraços,