[Resolvido] SelectOnMenu(JSF)+Many-To-One Não salva e nem dá erro

5 respostas
ErickRAR

Ei pessoal,

Pretendo fazer um selectOneMenu baseado numa tabela de cargos que tenho no banco.

O código no JSF:

Cargo:<h:selectOneMenu id="cargo"
			value="#{funcionarioControle.funcionario.cargo}">
			<f:selectItems value="funcionarioControle.listaCargos" />
		</h:selectOneMenu>

O listarCargos no FuncionarioControle:

public List<SelectItem> getListaCargos(){ List<SelectItem> lista = new ArrayList<SelectItem>(); DataModel dataModel = new CargoControle().getListarCargos(); for(Object object : dataModel){ Cargo cargo = (Cargo)object; lista.add(new SelectItem(cargo, cargo.getTitulo())); } return lista; }
O erro que aparece no JSF:

java.lang.IllegalArgumentException
	at com.sun.faces.renderkit.SelectItemsIterator.initializeItems(SelectItemsIterator.java:216)
	at com.sun.faces.renderkit.SelectItemsIterator.hasNext(SelectItemsIterator.java:135)
	at com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRenderer.java:762)
	at com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:844)
	at com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:298)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1786)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	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:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
	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:987)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)

Procurei pelo fórum mas não encontrei nada. :?

5 Respostas

Hebert_Coelho

Tente colocar cargo.getId() (ou qualquer id) ao invés do objeto.

Caso funcione um provável motivo do erro é por que você não definiu nenhum converter na sua aplicação.

ErickRAR

Não funcionou mesmo assim. Irei pesquisar sobre Converter.

Hebert_Coelho

Caso você esteja utilizando o JSF 2.0 aqui tem um tutorial: JSF: Converter e Bean Auto Complete.

ErickRAR

Estou sim. Bem didático o tutorial. Irei ler e testar aqui. Gracias. :slight_smile:

EDIT:

Consegui. Tive apenas que alterar para PrimeFaces.

<h:outputLabel for="cargo" value="cargo"/> <p:selectOneMenu id="cargo" value="#{funcionarioControle.funcionario.cargo}" effect="fade"> <f:selectItems value="#{funcionarioControle.listaCargos}"/> </p:selectOneMenu>

Obrigado pela ajuda mesmo assim.

ErickRAR

O erro parou, porém não salva está salvando no banco. Clico em inserir e não acontece nada.

FuncionarioControle

@ManagedBean
@SessionScoped
public class FuncionarioControle {
	private Funcionario funcionario;
	private FuncionarioDAO dao;
	private DataModel listaFuncionarios;
	private String cargoSelecionado;

	public FuncionarioControle(){
		funcionario = new Funcionario();
		dao = new FuncionarioDAO();

	}
	public  DataModel getListarFuncionarios() {
		List lista;
		lista = dao.consultarTodos();
		listaFuncionarios  = new ListDataModel(lista);
		return listaFuncionarios;
	}

	public Funcionario getFuncionario(){
		return funcionario;
	}

	public String getCargoSelecionado(){
		return cargoSelecionado;
	}
	
	public void setCargoSelecionado(String cargoSelecionado){
		this.cargoSelecionado=cargoSelecionado;
	}
	public void setFuncionario(Funcionario funcionario){
		this.funcionario=funcionario;
	}

	public List<SelectItem> getListaCargos(){
		DataModel list = new CargoControle().getListarCargos();
		List<SelectItem> listaItens = new ArrayList<SelectItem>();
		for(Object object: list){
			Cargo c = (Cargo)object;
			listaItens.add(new SelectItem(c,c.getTitulo()));
		}
		return listaItens;
	}

	public void prepararAdicionarFuncionario(ActionEvent actionEvent){
		funcionario= new Funcionario();
	}

	public void prepararAlterarFuncionario(ActionEvent actionEvent){
		funcionario = (Funcionario)(listaFuncionarios.getRowData());
	}
	public void prepararExcluirFuncionario(ActionEvent actionEvent){
		funcionario = (Funcionario)(listaFuncionarios.getRowData());
	}

	public void adicionarFuncionario(ActionEvent actionEvent){
		Cargo cargo = new Cargo();
		cargo.setTitulo(cargoSelecionado);
		cargo = new CargoDAO().consultar(cargo);
		this.funcionario.setCargo(cargo);
		dao.incluir(funcionario);
	} 

	public void alterarFuncionario(ActionEvent actionEvent){
		dao.alterar(funcionario);
	}

	public void excluirFuncionario(ActionEvent actionEvent){
		dao.excluir(funcionario);
	}
}

CargoConverter

@FacesConverter(value="cargoConverter")
public class CargoConverter implements Converter{

	@Override
	public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
		FacesContext context = FacesContext.getCurrentInstance();
		CargoControle cargoControle =(CargoControle)context.getELContext().getELResolver().getValue(context.getELContext(), null, "cargoControle");
		return cargoControle.consultarCargoPeloTitulo(arg2);
	}

	@Override
	public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
		if(arg2 != null && arg2 instanceof Cargo) 
				return ((Cargo)arg2).toString();
		return "";
	}
}

E finalmente o treco do JSF:

<h:outputLabel for="cargo" value="Cargo: " />
				<p:selectOneMenu id="cargo"
					value="#{funcionarioControle.cargoSelecionado}" effect="fade" converter="cargoConverter" >
					<f:selectItems value="#{funcionarioControle.listaCargos}" />
					
				</p:selectOneMenu>
Criado 29 de março de 2012
Ultima resposta 31 de mar. de 2012
Respostas 5
Participantes 2