Dois ManagerBeans em uma mesma página, é possível?

4 respostas
J

Olá peoples!

tenho uma Página xhtml a principio usando jsf 2.0 + primefaces 2.2

Surge uma duvida que estou a 2 dias parado nisso, tenho 1 página com 2 ManagerBeans ou seja

PageList.xhtml
Nela contem meu Managerbean:

@ManagedBean(name=clienteController)

@SessionScoped

public class ClienteController implements Serializable{

}

até aí tudo bem, o problema é que minha página tem uns includes por exemplo:

<ui:include src=“includes/editarEnderecoCliente.xhtml” />
nesta Página já contem outro ManagerBean

@SuppressWarnings(serial)

@ManagedBean(name=enderecoController)

@SessionScoped

public class EnderecoController implements Serializable{

}

tentei os 2 com Scopo Session , ViewScoped, instalei o Jboss weld para poder utilizar o @ConversationScope
Mas nada adiantou
Quando clico num clique que irá acessar o ManagerBean2 ele ocorre um erro na lista de um DataTable que tenho no ManagerBean1

AVISO: / by zero

java.lang.ArithmeticException: / by zero

at org.primefaces.model.LazyDataModel.setRowIndex(LazyDataModel.java:62)

at javax.faces.component.UIData.setRowIndex(UIData.java:451)

at javax.faces.component.UIData.iterate(UIData.java:1429)

at javax.faces.component.UIData.processDecodes(UIData.java:983)

at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1047)

só pelo fato de eu abrir uma <p:dialog>

Como consigo deixar os 2 em uma página só , alguem tem uma situação parecida ?
Qualquer coisa será bem vinda

4 Respostas

fpastore

Que eu saiba você pode colocar quantos managed beans você quiser dentro de uma página, talvez não seja esse o problema

Manda todo o código pra gente ver, provavelmente o erro é com os dados da lista, já que ele está tentando dividir algo por zero

P

Que eu saiba da pra usar quantos managerBean vc quiser

J

Estranho realmente,
Então segue abaixo meu código conforme pedido:

ManagerBean da Tela de consulta clientes.xhtml

@ManagedBean(name="clienteController")
@SessionScoped
public class ClienteController implements Serializable{
	
	private DataModel<Cliente> lazyModel;
	private ClienteDao clienteDAO;
	private Cliente cliente;
	private Endereco endereco;
	private List<Endereco> enderecos;
	
	@PostConstruct
	public void initialize(){
		_logger.info("# initialize");
		clienteDAO = ClienteDao.getInstance();
		load();
	}
	
	@PreDestroy
	public void finish(){
		clienteDAO = null;
	}
	
	@SuppressWarnings("serial")
	private void load(){
			lazyModel = new LazyDataModel<Cliente>(){
			public List<Cliente> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {
			   try {
				   Cliente c = new Cliente();
				   return clienteDAO.findAllCliente(c, first, pageSize);
			   } catch (DAOException e) {
				   _logger.log(Level.WARNING, e.getMessage(), e.getCause());
			   }
			   return null;
			}
			
			public int getRowCount() {
				int n =  clienteDAO.count(); // returna 0 (zero ) caso retorne nada
				return n;
			}
		};
	}
        /* getters e setters */
}

clientes.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.prime.com.tr/ui" 
    template="layout/template.xhtml">
    <ui:define name="body">
			<p:growl id="aviso" showSummary="true"/>
			 <h:form prependId="false" id="formLista">
  					<h:panelGrid columns="1" style="width:100%;text-align:right;">
########### Quando clico no botão NOVO ABAIXO QUE OCORRE AQUELE ERRO ###########################

		[b]<p:commandLink style="color:#000;" value="Novo" actionListener="#{clienteCadastroController.prepararAdicionar}" update="panelEdition,infoCliente" oncomplete="dialogCliente.show()"/>[/b]
####################################################################################
  					</h:panelGrid>
  					<p:outputPanel layout="block">
	  					<p:panel header="Resultado da busca #{clienteController.lazyModel.rowCount}">
<p:dataTable paginatorAlwaysVisible="true" id="listaCliente" value="#{clienteController.lazyModel}" var="cli">
		 	rows="15" paginator="true" dynamic="true" lazy="true" paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} "  selectionMode="single">
								<p:column style="width:230px;">
									<f:facet name="header">
										<h:outputText value="#{msg['cliente.nome']}" />
									</f:facet>
									<h:outputText value="#{cli.nome.fantasia}" />
								</p:column>
								<p:column style="width:130px;">
									<f:facet name="header">
										<h:outputText value="" />
									</f:facet>
									 <p:commandButton action="#{clienteCadastroController.excluir}" value="Excluir" update="listaCliente,aviso"> 
									 	<f:setPropertyActionListener value="#{cli}" target="#{clienteCadastroController.cliente}" /> 
									 </p:commandButton>
									 <p:commandButton actionListener="#{clienteCadastroController.prepararAlterar(cli)}" value="Alterar" update="listaCliente" oncomplete="dialogCliente.show()">
									 </p:commandButton> 
								</p:column>
								<p:ajaxStatus>  
					                <f:facet name="start">  
					                    <h:graphicImage value="images/ajaxloading.gif" />  
					                </f:facet>  
					                <f:facet name="complete">  
					                    <h:outputText value="" />  
					                </f:facet>  
					            </p:ajaxStatus>  
							</p:dataTable>
						</p:panel>
					</p:outputPanel>	
				  </h:form>
					<p:dialog id="panelEdition" header="#{clienteCadastroController.cliente.idCliente == 0 ? 'Novo' : 'Alterar' }" widgetVar="dialogCliente" resizable="false" modal="true" showEffect="slide" width="990" height="565">
			            	[b]<ui:include src="includes/cadCliente.xhtml">
			            	</ui:include>[/b]
			            	
	        	  	</p:dialog>
	</ui:define>
</ui:composition>

Segundo ManagerBean clienteCadastroController

@SuppressWarnings("serial")
@ManagedBean(name="clienteCadastroController")
@SessionScoped
public class ClienteCadastroController implements Serializable{

	private ClienteDao clienteDAO = ClienteDao.getInstance();
	
	private Cliente cliente;
	private Endereco endereco;
	private List<Endereco> enderecos;
	
	@PostConstruct
	public void initialize(){
		cleanUp();
	}
	
	private void cleanUp(){
		cliente = new Cliente();
		endereco = new Endereco();
		enderecos = new ArrayList<Endereco>();
	}
	
/* o Botão NOVO invoca esse método e dá o ERro de Array by /Zero do DataTable da primeiro ManagerBean */
	public void prepararAdicionar(ActionEvent actionEvent){
		cliente = new Cliente();
		endereco = new Endereco();
		enderecos = new ArrayList<Endereco>();
	}
	
	public void prepararAlterar(Cliente c){
		cliente = c;
		enderecos = new ArrayList<Endereco>(c.getEnderecos());
	}
	
	public void addEndereco(){
		enderecos.add(endereco);
		endereco = null;
	}

Erro ao clicar no botão:

20/01/2011 12:05:36 com.sun.faces.lifecycle.ApplyRequestValuesPhase execute
AVISO: / by zero
java.lang.ArithmeticException: / by zero
	at org.primefaces.model.LazyDataModel.setRowIndex(LazyDataModel.java:62)
	at javax.faces.component.UIData.setRowIndex(UIData.java:451)
	at javax.faces.component.UIData.iterate(UIData.java:1429)
	at javax.faces.component.UIData.processDecodes(UIData.java:983)
	at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1047)
	at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1047)
	at javax.faces.component.UIForm.processDecodes(UIForm.java:216)
	at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1047)
	at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1047)
	at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:926)
	at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78) ......

Não faço idéia do por que disso !

J

Consegui solucionar o problema do / by Zero

segue o código abaixo que resolveu o problema, na verdade só ajustei o getRowCount()

lazyModel = new LazyDataModel<Cliente>(){
			public List<Cliente> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {
			   try {
				   Cliente c = new Cliente();
				   List<Cliente> cs = clienteDAO.findAllCliente(c, first, pageSize);
				   return cs;
			   } catch (DAOException e) {}
			   return null;
			}
			
			public int getRowCount() {
				DataTable t = (DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent("formLista:listaCliente");
		         if(t.isLazy() && !t.initiallyLoaded()) {
		        	 t.loadLazyData();
		             t.markAsLoaded();
		         }
		         	
			 return clienteDAO.count();
			}
Criado 20 de janeiro de 2011
Ultima resposta 20 de jan. de 2011
Respostas 4
Participantes 3