Erro h:selectOneMenu

pessoal

tenho uma tela de cadastro que em varios lugares to usando o h:selectOneMenu

mas depois que coloquei eles, fica dando erro

olha o erro

java.lang.IllegalArgumentException: Argument Error: An option for component codigoCfop was not an instance of javax.faces.model.SelectItem. Type found: java.util.ArrayList. at com.sun.faces.renderkit.RenderKitUtils.getSelectItems(RenderKitUtils.java:336) at com.sun.faces.renderkit.html_basic.MenuRenderer.getOptionNumber(MenuRenderer.java:675) at com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:793) at com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:335) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:833) at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:279)

[code]

Exemplo dos dois combos que tenho na tela

<h:outputText value="Forma de Pagamento:" /> <h:selectOneMenu id="formPag" > <f:selectItem itemLabel="Pago" itemValue="0" /> <f:selectItem itemLabel="A pagar" itemValue="1"/> <f:selectItem itemLabel="Outros" itemValue="2"/> </h:selectOneMenu>


<h:outputText value="CFOP:" />
	<h:selectOneMenu id="codigoCfop" value="#{cadastroBean.cadastro.ide.CFOP}">
		<f:selectItems value="#{cadastroBean.listaCFOP}" />
	</h:selectOneMenu>

preciso de ajuxa

A exception lançada é bem clara: argumento ilegal, uma opção para o componente codigoCfop (que é o id do seu segundo combo) não era uma instância de SelectItem, mas sim de ArrayList.

É o seguinte, pra popular um combo vc deve sempre usar uma List de SelectItem “List”, só isso.
E pra popular essa lista faça algo como:

List<SelectItem> itens = new ArrayList<SelectItem>();

for (Cfop cfop : listaCFOP) {
   itens.add(new SelectItem(cfop, cfop.getDescricao())); //arg1=valor representado pelo item; arg2=o label que irá aparecer na lista de itens do combo na sua página
}

Aí no seu combo vc liga o value do “f:selectItems” dele a itens.

Acho que é isso, espero que quebre teu galho.
Abraço!

o componente h:selectOneMenu espera uma coleção de <SelectItem>.
monte seu método getListaCFOP dessa forma

public List&lt;SelectItem&gt; getListaAmbientes() { List&lt;SelectItem&gt; itens = new ArrayList&lt;SelectItem&gt;(); for(Ambiente a : listaAmbientes){ itens.add(new SelectItem(a.getId(), a.getDescricao())); } return itens; }

Fala javaCBA,

Seguinte, JSF não trabalha diretamente com objetos de entidades no h:selectOneMenu.
E sim com o tipo SelectItem.

Você tem 2 escolhas. Ou faz o cast para SelectItem no seu método ( A sua ArrayList retornada deve ser de )
, ou cria um Converter.

Tranquilo?

o tomahawk, a partir do 1.1.6 se não me engano, tem o selectItems que dá pra usar um Collection direto. Algo como:

<h:selectOneMenu id="codigoCfop" value="#{cadastroBean.cadastro.ide.CFOP}"> <t:selectItems value="#{cadastroBean.listaCFOP}" var="cfop" itemLabel="#{cfop.descricao}" itemValue="#{cfop}"/> </h:selectOneMenu>
Talvez a implementação que você usa também tenha.

[quote=Gbzao!]Fala javaCBA,

Seguinte, JSF não trabalha diretamente com objetos de entidades no h:selectOneMenu.
E sim com o tipo SelectItem.

Você tem 2 escolhas. Ou faz o cast para SelectItem no seu método ( A sua ArrayList retornada deve ser de )
, ou cria um Converter.

Tranquilo?
[/quote]

Como o amigo ozix falou, o tomahawk resolve o seu problema exatamente como ele descreveu, assim como a versão 2.0 do JSF, vc pode trabalhar diretamente com uma coleção de entidades da sua aplicação, da mesma forma do SelectItems do tomahawk.