Seam + EJB 3.0, DI?

Bom dia pessoal.

Seguinte, estou testando o JBoss Seam, e até agora estou gostando, porém fui tentar usa-lo com EJB 3.0, pra fazer DI, mas nada até agora.

O que tenho é um projeto pra EAR, um EJB JAR (onde tenho meus EJB’s e Facades) e um WAR com Seam.

A pergunta é, tem como fazer a injeção com a anotação @EJB dentro de um Seam Component?

Ou estou com conceito errado? Deveria se usar apenas um WAR e fazer a injeção atravéz de @IN mesmo?? Não fica “ruim” ter todas os “Facades” anotados com @Name ???

O que vocês acham pessoal?
Help me… please… ta dificil essa parte… hehe

É isso ai gente… valewwww

Pessoal, ninguém tem trabalhado com o Seam???

Tenha paciência. Provavelmente aqueles que pode te dar uma dica não irão ler e responder seu post em cerca de uma hora. Afinal de contas todos trabalhamos neh? :wink:

Hehe… verdade…

As vezes agente acaba se afobando um pouco… hehe… mals!!!
Principalmente quando isso está atrapalhando o trabalho… ai complica!!!

:smiley:

Esse cara trabalha na Red Hat e veio aqui em Natal apresentar o Seam e o RH Developer Studio mês passado. Procure o e-mail dele e torque figurinhas:

http://weblogs.java.net/blog/edgars/

Olá Rodrigo,

Estou trabalhando com o JBoss Seam e espero te ajudar.

Primeiramente vamos com calma. Você parece estar um pouco confuso. Comentários abaixo.

A resposta para essa pergunta é: “Dependende”. Você só vai conseguir fazer a injeção com a anotação @EJB se o seu componente Seam for também um componente Ejb. EJB e Seam são coisas separadas.

Aqui eu fiquei realmente muito confuso. Seu conceito não está errado, apenas mal organizado. Você pode (e em alguns casos até deve) utilizar @EJB. Mas primeiro você tem que decidir o que quer fazer.

Se você está criando um projeto que não vai precisar de um container de négócios então você irá precisar fazer o deploy em em um arquivo WAR e dessa forma não consegue utilizar o @EJB.

Caso você queira utilizar todo o poder da especificação EJB, então você vai fazer o deploy em um EAR e nesse caso pode utilizar tanto injeção de dependencia do EJB quanto do Seam. Mas com cuidado.

As anotações de depedência do Seam são realizadas dentro de componentes Seam (anotados com @Name). Essas anotações servem principalmente para fazer a “junção” entre componentes de interface gráfica (JSF) e componentes de negócio (EJB). Esse é um dos principais propósitos do Seam. Agir como uma “cola” entre essas camadas.

Esses componentes Seam podem também ser componentes EJB (Anotados com @Stateful ou @Stateless) e nesse caso podem usar a anotação @EJB para realizar a injeção de depêndencia. Mas nesse caso para componentes de negócio.

Não consegui entender o que você quiz dizer com “ruim”? Ruim em que sentido?
Os Facade anotados com @Name serão componentes Seam, isso é ruim para você porque?

Espero ter ajudado, DM

Olá DM.

Que bom ter alguém pra discutir esse assunto por aqui… já tinha desistido… hehe

Bom cara, eu realmente estava com alguns conceitos errados. Acho que porq só tinha visto exemplos simples de uso do Seam, só Seam Components simples e deploy com var…

“Foi então que aconteceu, vi o seamboking e minha vida mudou”… hehe

A idéia do “ruim” seria porq algumas todos os Facades ficariam expostos às páginas jsf… isso era o “ruim”, não sei se isso poderia pesar na performance ou não… uma vez que com EJB os Session Bean nem chegam à jsf.

Bom… mas a questão principal caraé o seguinte:
Usando a arquitetura EJB tinhamos: (me corriga se estiver errado por favor)

Entity -- Entidade da JPA Ejb Facade -- Stateless ou Statefull EJB para controlar o EntityManager basicamente Backing Bean -- Registrado no faces-config, injetamos o Ejb Facade e algumas vezes os métodos do Backing Bean refletem alguns do Ejb Facade
Nos exemplos que encotrei usando o Seam temos:
(aqui é que está a dúvida, se a arquitetura está correta)

Entity Component -- JPA mais Seam Component (em poucos casos só JPA) Ejb Seam Component -- Esse aqui é mágico, nele controlamos o EM, e publicamos diretamente ao JSF, pode ser Statefull ou Stateles, geralmente Statefull com Scopo Conversação (as "bijeções" ajuda de MAIS, sem falar no escopo conversação)
Na arquitetura acima, o Seam Component fica com o papel do Backing Bean e do Ejb Facade, ele faz bem isso, devido às injeções e com o auxilio do Entity Component fica mais facil ainda.

Mas a questão é a seguinte:
Isso está correto?
É a forma certa de se trabalhar com a arquitetura e o framework Seam?
Deve mesmo ser extinguido o Ejb Facade?

Bom cara é isso…
Mas me diz uma coisa, está sendo bom trabalhar com o Seam? Bem produtivo?

É isso ai…
Valeu e até mais!!!
Rodrigo

Olá Rodrigo,

Primeiramente, apenas para nivelamento, gostaria de te dizer que não sou nenhum “expert” em Seam ou EJB. Estou trabalhando a pouco tempo nisso e portanto algumas de minhas opiniões poderam estar incorretas.

Uma das discussões em relação ao Seam é devido ao seu “Magic Seam Component” 8) . Até onde ele pode ser performático. Se você acessar o site da JBoss vai encontrar alguns testes de stress e diversos comentários.

Só para exemplo se você quiser usar o Contexto Conversasional é necessário ter um Statefull Bean, dessa forma o seam traz os componentes EJB para a camada de aplicação. Você até pode usar Pojos, mas seus componentes Seam poderão ser apenas ou de sessão ou de eventos, e aí de nada adianta, concorda?

Vamos a suas questões:

[quote]Mas a questão é a seguinte:
Isso está correto?
É a forma certa de se trabalhar com a arquitetura e o framework Seam?
Deve mesmo ser extinguido o Ejb Facade?[/quote]

1 Isso está correto?

O que seria uma arquitetura correta para você Rodrigo? Do meu ponto de vista seria uma arquitetura que segue as boas práticas, adiquiridas ao longo do tempo. Mas mesmo assim posso ter duas arquiteturas diferentes e ambas serem boas para resolver o mesmo problema, correto?

O seamboking é um ótimo exemplo e ele modela uma arquitetura, porém você sabe que o exemplo é pequeno e não irá crescer, esse não é o propósito dele, que é ser apenas um programa seam de exemplo. Portanto, não é de se admirar que ele “misture tudo” e você acaba tendo acesso ao EM na camada de aplicação. Imagine que os requisitos aumentem, até onde você acha que ele consegue crescer sem que aquele código fica uma misturança?

  1. É a forma certa de se trabalhar com a arquitetura e o framework Seam?
  2. Deve mesmo ser extinguido o Ejb Facade?

Essas perguntas substituem muito bem a primeira Rodrigo. Novamente, não existe uma arquitetura ideal, uma boa arquitetura é montada baseando-se em experiências passadas e conhecimentos adiquiridos ao longo do tempo. A arquitetura EE é fruto disso, por isso as mudanças tão radicais na sua especificação (2.1 para 3).

Não recomendaria a extinção dos Ejb Facade, dessa forma você vai ser obrigado a trabalhar com a camada de aplicação, negócio e de dados tudo junto/misturado/embaralhado. Será que isso é uma boa prática? Será que a manutenibilidade vai ser tão boa quanto deixar tudo divido em camadas? Creio que você sabe as respostas a essas perguntas.

Uma questão interessante de ser respondida é: Até onde vai o Seam? Até onde posso usar bijeção? O que ela tem de tão maravilhoso e mágico? Ela substitui a anotação @EJB? Qual a sua opinião?

Grato, DM

Olá DM!!

Continuando…

Quando digo arquitetura ruim, entenda como algo “não digno das boas praticas”, principalmente pensando na especificação do EJB 3.0. (se bem que usar o Seam já sai da especificação… hehe… mas ai é outra história… :D)

[quote=demorgan]
Só para exemplo se você quiser usar o Contexto Conversasional é necessário ter um Statefull Bean, dessa forma o seam traz os componentes EJB para a camada de aplicação. Você até pode usar Pojos, mas seus componentes Seam poderão ser apenas ou de sessão ou de eventos, e aí de nada adianta, concorda?[/quote]

É exatamente essa a questão de se utilizar ou não o Facade…
Como você disse abaixo, com toda certeza é muito melhor “modularizar”, dividir tudo como manda a boa pratica do EJB 3.0.

Sem usar o Facade concordo contigo, fica muito misturado o código, não sei até que ponto isso vale a pena ou não, talvez em aplicações pequenas (como o seamboking) você até possa fazer assim, pois muita coisa vc consegue injetar (é praticamente uma mágica mesmo… hehe), mas em aplicações de grande porte… a coisa complica… principalmente em termos de manutenção e legibilidade de código, e se for colocar varios programadores juntos então… quanto mais modularizado melhor.

DM particularmente sou totalmente favoravel ao uso do Facade, mesmo as vezes o Backing Bean sendo uma “cópia” com alguns métodos a mais pra view, acho que o Facade divide muito bem as camadas.

Tá ai uma ótima coisa pra se pesquisar!!!

Concordo contigo novamente, acho muito aconselhavel usar o Facade, mas vejo alguns problemas com isso… supondo um caso que aconteceu comigo e provavelmente seja muito comum em qualquer sistema de medio porte acima:
Você presisa usar o tal do Conversation, e agora vamos tentar encaixar com o Facade, assim teremos:
– Entity Component
Show de bola, JPA + a injeção do Seam ajuda muito, principalmente se precisarmos de uma Entity que fique armazenada na sessão, com a bijeção vc pode usa-la em qualquer Component que precisar.
– Ejb Facade (Stateless se possivel)
Tem a função de basicamente abstrair o uso do EntityManager, NÃO é um Seam Component
– Seam Component (Old Backing Bean :D)
A função de conversação é extremamente util!! Então esse cara aqui tem que ser um Ejb Stateful e um Seam Component com scope conversation. Usamos a @EJB para injetar o Facade.
Opa, aqui um problema, DOIS Ejb’s, quando “antigamente” (até parece que é longe… hehe) usariomos UM Ejb e UM Backing Bean.

Particularmente, eu gosto da idéia acima, acho que vc modulariza e consegue muita coisa boa com o component, porém… e a performance… agora temos um EJB Stateless e um EJB Stateful e ainda por cima o Seam controlando o fluxo de vida por causa do conversation.
Sem falar na maravilha que é ter duas interfaces pra ficar montando, nunca aconteceu de colocar o método na implementação e esquecer da bendita interface??? hehehehe :smiley:

Sinceramente, vou começar um projeto é creio que vou usar a arquitetura acima… mais pra testes e aprendizado que outra coisa.

Qual tua opinião cara?

Até onde vai, sinceramente ainda não sei cara… mas pelo pouco que vi, vai muito longe, o Seam tem se mostrado muito bom para “interligar” as camadas, e com ciclo de vida também!!!

Usar bijeção, pelo que vejo, sempre que possível, mas tem que ficar extremamente claro pra você como isso funciona, se não você se perde, um ótimo exemplo disso é, quem nunca precisou acessar uma Entity que vc armazenou num Backing Bean se Sessão? Oq vc faze nesse caso é usar o createValueBinding do FacesContext… esquece… injeção sem dúvida alguma!!!

Quanto a substituir a @EJB, eu diria que em alguns casos talvez, mas acho que deveria se trabalhada em conjunto com ela, não substitui-la. Creio que o Seam substitui mais o Backing Bean que o @EJB em si…

Agora o quão maravilhoso seja, não sei… vejo muitas vantagens e algumas dúvidas, mas não necessáriamente desvantagens…
O Seam traz muita coisa boa, por exemplo o controle do fluxo de vida, as bijeções, uma camada de segurança razoavel.
Acho que é bom sim, se não não viraria uma JSR… mas ainda restam algumas dúvidas (pelo menos pra mim)…

É isso ai, acho que escrevi de mais!!!
Hehehe

Abraços e até!!!

Rodrigo

É isso ai Rorigo,

Creio que agora você esteja no caminho certo…

É isso ai mesmo, só para lembrar um dos principais objetivos de dividir um software em camadas é diminuir a complexidade, o famoso “dividir para conquistar”. É assim por exemplo que a gente joga futebol, se alguém quiser, pode fazer todos os papéis (goleiro, atacante, meio-campo), porém, excluindo o pelé, creio que ninguém vai fazer isso de forma eficiente.

EJB serve para uma coisa, JSF para outra, Backing Bean para uma, componente EJB para outra. Um roda em container web e o outro em container ejb. E o Seam serve para conectar/juntar/colar os dois :smiley:

Creio que isso você já sabe e tá cansado de ouvir, mas o que importa é nunca esquecer disso.

[quote] A função de conversação é extremamente util!! Então esse cara aqui tem que ser um Ejb Stateful e um Seam Component com scope conversation. Usamos a @EJB para injetar o Facade.
Opa, aqui um problema, DOIS Ejb’s, quando “antigamente” (até parece que é longe… hehe) usariomos UM Ejb e UM Backing Bean. [/quote]

Parabéns, ótima conclusão.

[quote] Sinceramente, vou começar um projeto é creio que vou usar a arquitetura acima… mais pra testes e aprendizado que outra coisa.

Qual tua opinião cara? [/quote]

Quando a questão é aprendizado e você não quer perder muito tempo, ou em um projeto de escopo minúsculo que você vai manter sozinho, não tem problema em fazer código macarrão (tudo misturado). Agora se você quer aprender um pouco de arquitetura de software, usar padrões de projeto, creio que existem vários outros que podem te ajudar nesse caso.

A primeira vista não tem como se render ao Seam, ele facilita muita coisa e tem uma ótima propaganda, mas como qualquer outra tecnologia, tem pontos fortes e fracos, normalmente a propaganda só mostra os fortes, os fracos você vai notando com o passar do tempo.

Quanto a virar um JSR, já tem até “nome bonitinho” Web Beans : http://www.theserverside.com/news/thread.tss?thread_id=40531

Um Feliz Natal e Próspero Ano Novo, DM

Olá Rodrigo,

Gostaria de saber se você começou a brincar com o Seam desde a ultima vez que conversamos.

Att, DM

Só para não criar um tópico novo, vou utilizar esse!

A minha dúvida é simples, só é possível disponibilizar meus POJOs mapeados no JSF, através do SEAM?

Ou seja, eu tenho uma entidade Pessoa, essa entidade tem a propriedade nome, se eu fizer na minha view:

<h:inputText size="60" maxlength="200" id="nome" value="#{pessoaBean.usuario.nome}" />

Considerando que Usuario é uma Pessoa e, considerando também o mapeamento a seguir:

	<managed-bean>
		<managed-bean-name>pessoaBean</managed-bean-name>
		<managed-bean-class>mypackage.PessoaBean</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
		<managed-property>
			<property-name>usuario</property-name>
			<property-class>mypackage.entity.Usuario</property-class>
			<value></value>
		</managed-property>
	</managed-bean>

Não funciona?

Valeu!!!

Deixa quieto…faz tempo que eu não brincava com o JSF e fiz esse mapeamento incorreto da propriedade Usuario no ManagedBean!

Abraços

Oi pessoal,

vi que vocês tiveram uma boa discursão sobre o Seam. Estou começando a tabalhar com ele e estou com problemas, alias nem consegui começar.
Estou tentando utilizar o Seam com EJB e não consigo acessar o EJB de forma alguma. Se eu tiro a anoção @STATELESS e a implementação de interface e deixo a classe como POJO ele funciona blz, mas quando volto com a anotação do EJB dá o erro:

Caused by org.jboss.seam.InstantiationException with message: "Could not instantiate Seam component: teste" Caused by javax.naming.NameNotFoundException with message: "TesteBean not bound"

Já tentei com o Seam 2.0.2 e o 2.1 e com o JBoss 4.2.2 e o 5.0.0-CR

Alguma idéia?

Mais uma coisa, vi em alguns exemplos que os EJB’s são declarados no web.xml, isso é necessário? Em que situação?

[quote=maurenginaldo]Oi pessoal,

vi que vocês tiveram uma boa discursão sobre o Seam. Estou começando a tabalhar com ele e estou com problemas, alias nem consegui começar.
Estou tentando utilizar o Seam com EJB e não consigo acessar o EJB de forma alguma. Se eu tiro a anoção @STATELESS e a implementação de interface e deixo a classe como POJO ele funciona blz, mas quando volto com a anotação do EJB dá o erro:

Caused by org.jboss.seam.InstantiationException with message: "Could not instantiate Seam component: teste" Caused by javax.naming.NameNotFoundException with message: "TesteBean not bound"

Já tentei com o Seam 2.0.2 e o 2.1 e com o JBoss 4.2.2 e o 5.0.0-CR

Alguma idéia?

Mais uma coisa, vi em alguns exemplos que os EJB’s são declarados no web.xml, isso é necessário? Em que situação?

[/quote]

Se vc tiver utilizando o JBoss não precisa declarar os ejbs no web.xml.

Mas se tiver utilizando um container padrão jee dai precisa sim.

Eu uso glassfish e precisa declarar os ejbs no web.xml

acho que só precisa declarar se forem locais...

Isso ocorre no deploy?

[quote=tubiluki]

Se vc tiver utilizando o JBoss não precisa declarar os ejbs no web.xml.

Mas se tiver utilizando um container padrão jee dai precisa sim.

Eu uso glassfish e precisa declarar os ejbs no web.xml

acho que só precisa declarar se forem locais... [/quote]

Ficou um pouco confuso, pois o JBoss 5.0CR implementa a espeficiação JEE 5. Então vc quis dizer que se utilizar JBoss eu não preciso declarar de nenhuma maneira?

E alguém tem idêia de como resolver o erro que está acontecendo?

[quote=felipeguerra][quote=maurenginaldo]

Caused by org.jboss.seam.InstantiationException with message: "Could not instantiate Seam component: teste" Caused by javax.naming.NameNotFoundException with message: "TesteBean not bound"
[/quote]
Isso ocorre no deploy?[/quote]

Oi Felipe,

Esse erro ocorre quando eu clico no botão na minha tela para chamar um evento que está dentro do meu componente Seam/EJB. O que me deixou mais intrigado é que o erro ocorre e o seam redireciona para a página de debug dele e olhando a página de debug ele mostra os componentes que estão criados e o componente que estou acessando está lá.

Aqueles arquivos de conf: components.xml, etc, etc, vc alterou?

Sou bem leigo no Seam, mas estou lendo a especificação pra tentar te ajudar!

Abraço

Sim tudo alterado.