[RESOLVIDO] - [EJB] - EL deve chamar diretamente a camada de negócio, ou não?

Bom dia,

Ao implementar um CRUD, surgiu uma pequena duvida:

alunos.xhtml:

[code]<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f=“http://java.sun.com/jsf/core”>

<h:head>
<title>Alunos</title>
</h:head>

<h:body>
<h1>Novo Aluno</h1>
<h:form>
<h:outputLabel value=“Nome: " />
<h:inputText value=”#{alunoMB.aluno.nome}" />

	&lt;h:outputLabel value="Matrícula: " /&gt;
	&lt;h:inputText value="#{alunoMB.aluno.matricula}" /&gt;

	&lt;h:commandButton action="#{alunoMB.adiciona}" value="Salvar" /&gt;
&lt;/h:form&gt;

&lt;h:form&gt;
	&lt;h1&gt;Lista de Livros&lt;/h1&gt;
	&lt;h:dataTable value="#{alunoMB.alunos}" var="aluno"&gt;
		&lt;h:column&gt;
			&lt;h:outputText value="#{aluno.nome}" /&gt;
		&lt;/h:column&gt;
		&lt;h:column&gt;
			&lt;h:outputText value="#{aluno.matricula}" /&gt;
		&lt;/h:column&gt;
	&lt;/h:dataTable&gt;
&lt;/h:form&gt;

</h:body>
</html>[/code]

AlunoMB.class:

package managedbeans;

import java.io.Serializable;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.inject.Named;



import entidades.Aluno;
import sessionbeans.AlunoRepository;


@Named
@SessionScoped
public class AlunoMB implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@EJB
	private AlunoRepository alunoRepository;

	private Aluno aluno = new Aluno();
	private List&lt;Aluno&gt; alunosCache;

	public Aluno getAluno() { 
		return aluno;
	}

	public void setAluno(Aluno aluno) {
		this.aluno = aluno;
	}
	
	public void adiciona() {
		this.alunoRepository.adiciona(this.aluno);
		this.aluno = new Aluno();
		this.alunosCache = null;
	}

	public void atualiza(Aluno aluno) {
		this.alunoRepository.atualiza(aluno);
		this.aluno = new Aluno();
		this.alunosCache = null;
	}

	public void procura(Aluno aluno) {
		this.alunoRepository.procura(aluno.getId());
		this.aluno = new Aluno();
		this.alunosCache = null;
	}

	public void remove(Aluno aluno) {
		this.alunoRepository.remove(aluno.getId());
		this.aluno = new Aluno();
		this.alunosCache = null;
	}
			

	public List&lt;Aluno&gt; getAlunos() {
		if (this.alunosCache == null) {
			this.alunosCache = this.alunoRepository.getAlunos();
		}
		return this.alunosCache;
	}

}

AlunoRepository.class:

package sessionbeans;

import java.io.Serializable;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;



import entidades.Aluno;


@Stateless
public class AlunoRepository implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@PersistenceContext
	private EntityManager entityManager;

	public void adiciona(Aluno aluno) {
		this.entityManager.persist(aluno);
	}

	public void atualiza(Aluno aluno) {
		this.entityManager.merge(aluno);
	}

	public Aluno procura(Long id) {
		return this.entityManager.find(Aluno.class, id);
	}

	public void remove(Long id) {
		Aluno aluno = this.entityManager.find(Aluno.class, id);
		this.entityManager.remove(aluno);
	}
	 
	public List&lt;Aluno&gt; getAlunos() {
		TypedQuery&lt;Aluno&gt; query = this.entityManager.createQuery(
				"select x from Aluno x", Aluno.class); 
		return query.getResultList();
	}

}

Em um determinado capítulo da apostila da Caelum, é proposto um pequeno exercício, a minha solução é exibida logo acima. Bom, eu gostaria de saber se a Expression Language deveria chamar diretamente a camada de negócio ou se o EJB suporta, em termos de padrão de arquitetura, a minha solução?

Desde já eu agradeço!

[]'s

No geral vc como responsável arquitetural pode fazer qualquer coisa na sua arquitetura! kkkkk
Desde que justifique as estruturas e possa gerenciar os contras…
No seu caso especifico eu realmente não estendi sua duvida…

eu não sei se você intendeu errado o que que é o que ou se eu intendi errado sua duvida mas… você não está chamando a “camada de negócio” na página, está chamando o managed bean (no meu entendimento, camada de negócio seria o modelo e o managed bean não faz parte do modelo, para mim ele está mais ligado ao controle do que ao modelo).

não vi nada de errado na sua abordagem.

[quote=maior_abandonado]eu não sei se você intendeu errado o que que é o que ou se eu intendi errado sua duvida mas… você não está chamando a “camada de negócio” na página, está chamando o managed bean (no meu entendimento, camada de negócio seria o modelo e o managed bean não faz parte do modelo, para mim ele está mais ligado ao controle do que ao modelo).
não vi nada de errado na sua abordagem.[/quote]

Justamente a minha duvida…perguntar uma coisa no qual ele não esta fazendo…

Obrigado rapaziada,

Eu vou reformular a pergunta. Eu gostaria de saber se eu devo fazer: Visão -> Modelo, da maneira que eu não fiz. Ou, Visão -> Controle -> Modelo, do jeito que eu fiz, espero que tenha ficado claro agora. :wink:

[]'s

[quote=getAdicted]Obrigado rapaziada,

Eu vou reformular a pergunta. Eu gostaria de saber se eu devo chamar fazer: Visão -> Modelo, da maneira que eu não fiz. Ou, Visão -> Controle -> Modelo, do jeito que eu fiz, espero que tenha ficado claro agora. :wink:

[]'s[/quote]

Agora simmmmmmmmmmm…kkkkkkkkkk

  • Segundo a DDD…uma camada pode ter mutliplas dependências desde que seje de camadas superiores adjacentes (flexibilidade aqui pode ficar comprometida, depende…)
  • Segundo Grag Lairmam uma camada deve ter dependências apenas para camadas adjacentes, encapsulando camadas mais internas (+ flexibilidade)
  • Segundo Fernando Franzini (euzinho) vc pode estabelecer a dependência que vc quiser, desde que requisitos sejem cumpridos. (tenha um bom senso em flexibilidade e requisitos)
  • Unica coisa que vc pode fazer mas NUNCA DEVE é dependências acíclicas.
    A decisão é sua :lol:

[quote=getAdicted]Obrigado rapaziada,

Eu vou reformular a pergunta. Eu gostaria de saber se eu devo fazer: Visão -> Modelo, da maneira que eu não fiz. Ou, Visão -> Controle -> Modelo, do jeito que eu fiz, espero que tenha ficado claro agora. :wink:

[]'s[/quote]

o correto é fazer com as 3 camadas, seguir o padrão … imagina que você queria mudar a origem destes dados, vamos dar um exemplo, você tem uma classe pai Pessoa e duas classes filhas, pessoa física e jurídica (exemplo clássico). Agora vamos supor que você vai dar manutenção numa tela que liste pessoas para que na tabela de pessoas pegue só pessoas fisicas, só juridicas, ambas, use determinados filtros…etc. Esta inteligencia sobre chamar qual dao no modelo deve ser chamado não deve ficar na visão (e um dao para todos estes casos pode também não ser interessante).

Esse é um exemplo meio genérico mas você manter um controller ai pode te faacilitar as coisas na hora da manutenção mais tarde.

Complementando a ultima do maior_abandonado…
Criamos “camadas logicas” para agregar algo que sera reutilizável em vários pontos diferentes da solução…que foi um dos vários exemplos comentado pelo maior_abandonado…
Mas pelo seu exemplo simples não existe essa necessidade…não precisa criar camada sem necessidade…

A minha dúvida foi sanada, muito obrigado, amigos!

[]'s