Como capturar a instancia do meu ManagedBean criada pelo jsf

9 respostas
F

oi..... tava tentando criar um logica de negocio qe pra um projeto hello world mas ta dando NullPointerException, segue codigo:

package br.edu.olamundo.managedbean;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

import br.edu.olamundo.business.OlaMundoBusiness;

/**
 * 
 * Classe do JSF (Managed Bean)
 * 
 * */
@RequestScoped
@ManagedBean
public class OlaMundoBean {

	private String texto = "Vazio";
	
	/**
	 * Invoca o método que possui a regra de negócio
	 * a ser aplicada através da classe Business
	 * */
	public void paginaOlaMundo() {
		new OlaMundoBusiness().paginaOlaMundo();
	}
		
	public String getTexto() {
		return texto;
	}
	
	public void setTexto(String texto) {
		this.texto = texto;
	}
}
package br.edu.olamundo.business;

import javax.faces.bean.ManagedProperty;

import br.edu.olamundo.managedbean.OlaMundoBean;


/**
 * 
 * Classe de Business (Regras de Negócio)
 * 
 * */
public class OlaMundoBusiness {

	@ManagedProperty(value="#{olaMundoBean}")
	private OlaMundoBean olaMundoBean;
	
	/**
	 * Lógica de negócio do método helloWorld
	 * */
	public void paginaOlaMundo(){
		olaMundoBean.setTexto("Olá Mundo.");
	}
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:c="http://java.sun.com/jsp/jstl/core" >
        
<h:head>  
	<title>Escopos de Sessão</title>  
</h:head>  
 
<h:body>  
    <h:form>  
    	<h:commandLink action="#{olaMundoBean.paginaOlaMundo}" value="Clique" /> <br />    
		<h:outputText value="#{olaMundoBean.texto}"></h:outputText>
	</h:form>
</h:body>
</html>

9 Respostas

F

se eu tento mudar na classe Business para private OlaMundoBean olaMundoBean = new OlaMundoBean(); nao da mais erro de NullPointerException em tempo de execução porem nao exibe a mensagem correta qe
seria ola mundo…

F

como eu pego a instancia criada pelo jsf? pra usar/manipular da maneira qe eu queira?

A

Veja se te ajuda: http://www.guj.com.br/java/130519-capturar-um-bean-instanciado-pelo-jsf

F

n tenddíii ainda …

da a exception MethodBindingMethodExpressionAdapter

D

Anote o seu OlaMundoBusiness com @Named também.

Mais eu acho que essa arquitetura esta errada, porque você chamaria um ManagedBean na camada de negócio, quando deveria ser o contrario?

ManagedBean será somente para capturar eventos e dados vindos da view, a lógica de negocio deveria estar na camada de negócio e o managedBean chamaria a sua classe de negócio.

F

simm… o bean chama a classe business e a logica entao e executada, mas, quis setar um valor de teste, para ser visualizado, para tanto preciso/devo pegar o bean corrente qe foi instanciado pelo jsf
para passar valor nele e ele mostrar no view, é como se fosse um hello world, tendee? pode me ajudar na arquitetura entao?

D

Quando eu falei da annotation @Named eu me esqueci de perguntar se estava utilizando o weld para injeção de dependencia, caso sim, fica mais facil, segue o exemplo:

@Named
public class MeuService{
	
	private final EntityManager manager;
	
	@Inject
	public MeuService(final EntityManager manager){
		this.manager = manager;
	}
	
	//CRUD
	//Regras de negocio;
}

@Named
public class MeuBean{
	
	private final MeuService meuService;
	
	@Inject
	public MeuBean(final MeuService meuService){
		this.meuService = meuService;
	}
	
	//metodos que chamam os cruds, e regras de negocio

}

Basicamente é isso, o *.Service, são suas classes de negócio e manipulação dos dados e o .Bean são os que pegam os valores da view(.xhtml) e mandam pro service.

Caso vc não esteja utilizando nenhum framework para injeção de dependência (recomendo utilizar um, existem vários, weld, spring, guice, etc), o codigo fica como abaixo:

public class MeuService{
	
	private final EntityManager manager = new javax.persistence.Persistence.createEntityManagerFactory("default").createEntityManager();
	
	//CRUD
	//Regras de negocio;
}

@ManagedBean
public class MeuBean{
	
	private final MeuService meuService = new MeuService();
	
	
	//metodos que chamam os cruds, e regras de negocio

}

Existem várias abordagem de arquiteturas, mesmo os nomes com sufixo *.Service ou *.Bean, são opcionais, vai do padrão de projeto que vc utilizar.
Bom nesse, exemplo eu assumi que vc esta utilizando uma implementação de JPA para persistencia. E também não mencionei a entidade do banco de dados.

Espero ter ajudado de alguma forma.

F

oiiiiiiiiii… tá dificilde tender… vc sabe com o ManagedProperty do jsf?

D

da forma que vc esta fazendo não tem como fazer, porque o jsf ira instanciar esse objeto para vc, e para isso esse objeto tem que estar anotado com @ManagedBean.

Criado 4 de julho de 2011
Ultima resposta 13 de jul. de 2011
Respostas 9
Participantes 3