Arquitetura de Projeto EE

2 respostas
L

Colegas,

Estou migrando uma (A) aplicação JSF 1.2 + Spring 2 + Hibernate 3 para uma solução (B) JSF 1.2 + EJB3/JPA + Hibernate e estou com dúvidas quanto a definição da arquitetura. Na aplicação (A) o projeto está divido na seguinte estrutura : - Dá Página até o banco faço o seguinte caminho: 1) Minhas páginas XHTML + o Framework Faceletes para montar os templates. 2) A página acessa ManagedBeans do JSF 3) Esse ManagedBean tem uma classe "Manager" (uma abstração para uma camada de serviços) injetada. Exemplo:
public class UsuarioBean {
                  
                  	public UserManager mgr;
                  	.
                  	.
                  	get and sets
                  
                  }
4) Esse UserManager é um bean do Spring que faz o papel de uma camada de serviços. 5) Nesse UserManager é injetado um DAO ( que também está mapeado como um bean do Spring ), por exemplo:
public class UserManagerImpl implements UserManager{
				    private UserDAO dao;
    				
    				public void setUserDAO(UserDAO dao) {
				        this.dao = dao;
				    }
				    
		    		public User login(User user) {
        				return this.dao.login(user);
    				}
			}
6) E esse DAO que é um DAOHibernate ( extends HibernateDaoSupport ) acessa um POJO :
public class UserDAOHibernate extends HibernateDaoSupport implements UserDAO {
           			
           			public User login(User user) {
    					DetachedCriteria c = DetachedCriteria.forClass(User.class);
        				c.add(Restrictions.eq("userName",user.getUserName()));
						c.add(Restrictions.eq("password",user.getPassword()));	
        				List results = getHibernateTemplate().findByCriteria(c);
        				if (results == null || results.isEmpty()){
            				return null;
        				} 
        				return (User)results.get(0);
    				}
7) Esse POJO é uma classe JPA, mapeada como um @Entity. Na aplicação (B) o projeto está divido na seguinte estrutura : - Modulo EAR que encapsula módulos EJB e um módulo WAR. Aqui moram minhas dúvidas. - Dá Página até o banco é feito o seguinte caminho: 1) Minhas páginas XHTML + o Framework Faceletes para montar os templates. 2) A página acessa ManagedBeans do JSF 3) Esse ManagedBean faz um lookup numa classe Facade Exemplo:
public class UsuarioBean {
                    
                    private void listUsuarios() {
	                    UsuarioFacadeLocal usuarioFacade = (UsuarioFacadeLocal) lookupUsuarioFacade();
				        List usuarios = usuarioFacade.findAll();
				        for (Iterator it = usuarios.iterator(); it.hasNext();) {
				            Usuario elem = (Usuario) it.next();
				            System.out.println(elem.getNome());			            
				        }
				    }			        
			        
			        private UsuarioFacadeLocal lookupUsuarioFacade() {
				        try {
				            Context c = new InitialCon	text();
				            return (UsuarioFacadeLocal) c.lookup("ModuloEAR/UsuarioFacade/local");
				        }
				        catch(NamingException ne) {
				            Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught" ,ne);
				            throw new RuntimeException(ne);
				        }
				    }
4) Na implementação da classe UsuarioFacade eu tenho os métodos ( que seriam os métodos DAOs da arquitetura antiga ) para salvar/excluir/pesquisar.
@Stateless
					public class UsuarioFacade implements UsuarioFacadeLocal {

					    @PersistenceContext
					    private EntityManager em;
					    
					    /** Creates a new instance of UsuarioFacade */
					    public UsuarioFacade() {
					    }

					    public void create(Usuario usuario) {
					        em.persist(usuario);
					    }

					    public void edit(Usuario usuario) {
					        em.merge(usuario);
					    }
Buenas, Minhas dúvidas : 1) Esta arquitura (B) pode ser melhorada como ? 2) A arquitura (B) não está muito acoplada ? 3) Para cada Entity, por exemplo, Cliente, Fornecedor, Profissao eu teria que ter um EJB ? Eu gostaria de opniões sugestões o que for possível. Um grande abraço, Leandro.

2 Respostas

R

kra usa um Business Delegate para ser acessado pelo managed bean e no delegate usa um service locator para fazer os lookup´s aos ejb´s, tipo:

jsp -> managed bean -> delegate -> servicele locator -> session bean -> dao -> BD

acho que isso seria o minimo para essa arquitetura que vc está montando

L

Rafael,
Business Delegate e ServiceLocator são realmente necessários quando se está utilizando EJB3 ?

Ob.: Está minha pergunta não é uma critica e sim uma dúvida mesmo. Tipo você poderia me explicar de porque utilizar estes dois patterns ?

Um abração,
Leandro.

Criado 25 de outubro de 2007
Ultima resposta 3 de nov. de 2007
Respostas 2
Participantes 2