Seam + EJB 3.0, DI?

37 respostas
R

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

37 Respostas

R

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

B

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:

R

Hehe… verdade…

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

:smiley:

B

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/

D

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

R

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

D

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:

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?

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

R

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)

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?

É 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

D

É 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.

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.

Parabéns, ótima conclusão.

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?

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

D

Olá Rodrigo,

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

Att, DM

F

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!!!

F

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

Abraços

M

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?

T

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?

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...
F

Isso ocorre no deploy?

M

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...

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?

M

felipeguerra:
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"


Isso ocorre no deploy?

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á.

F

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

M

Sim tudo alterado.

T

maurenginaldo:
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...

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?

No Jboss 5 não sei mas no 4.2.3 não precisava.

A

maurenginaldo, você gerou a estrutura de seu .ear através do seam-gen?

O necessário para rodar um EJB como Seam Component é:

  • Existir um ejb-jar.xml no META-INF do ejbjar contendo o interceptor org.jboss.seam.ejb.SeamInterceptor e um assembly-descriptor.
  • Exisitir neste mesmo projeto um components.properties com uma entrada para jndiPattern
  • Possuir a tag <core:init jndi-pattern="@jndiPattern@"/>
  • Existir uma interface local ou remota (ou ainda ambas), para o componente anotado com @Statless ou @Stateful

Para testar se a configuraçao de seu EAR esta ok, faça um lookup em um cliente standalone. Se você conseguir recuperar um proxy para seu EJB, significa que ele esta ok e seu problema esta nas Seams configurations mesmo. Porém, se um simples lookup nao rola, é pq seu EJB esta com problemas e o Seam não tem lá muita coisa a ver com isso.

[]'s
Alessandro

A

… mais um detalhe quanto ao resto da discussão:

  1. Arquitetura com JBoss Seam não significa expor o EntityManager em qualquer classe. Não é pq o Booking Sample tem explícita as APIs de persistencia que essa é uma regra para aplicações Seam. O framework não impoe arquitetura alguma.

  2. Não existe nada na especificação JavaEE5 que diga sobre ter que registrar EJBs em web.xml.

M

Oi Alessandro, mais um vez obrigado pela força.

Consegui resolver o problema, o cenário foi o seguinte:

Estava criando um projeto Seam WAR e colocando os componentes Seam/EJB dentro dele. Cheguei inclusive a criar um projeto Seam EAR mas colocando os componentes Seam/EJB dentro do projeto WEB. Trocando idéia com outro colega ele me disse que os seam/EJB’s tem que estar dentro do projeto EJB. Criei um projeto Seam EAR e coloquei os componentes seam/EJB dentro do módulo EJB e funcionou blz!!!
Um pequeno desconhecimento da arquitetura que me custou alguns dias.

Obrigado a todos.

U

maurenginaldo:
Oi Alessandro, mais um vez obrigado pela força.

Consegui resolver o problema, o cenário foi o seguinte:

Estava criando um projeto Seam WAR e colocando os componentes Seam/EJB dentro dele. Cheguei inclusive a criar um projeto Seam EAR mas colocando os componentes Seam/EJB dentro do projeto WEB. Trocando idéia com outro colega ele me disse que os seam/EJB’s tem que estar dentro do projeto EJB. Criei um projeto Seam EAR e coloquei os componentes seam/EJB dentro do módulo EJB e funcionou blz!!!
Um pequeno desconhecimento da arquitetura que me custou alguns dias.

Obrigado a todos.

Caro maurenginaldo.
Blzaa. Estou com um problema idêntico ao teu, Estou iniciando no seam agora e confeço que to meio perdido na arquitetura gerada pelo jboss sem, Mas me da uma força ai… daria pra ser mais claro no que vc fez pra resolver o problema.
Tipo: Onde fica os arquivos seam/EJBs? para onde tenho que copia-los? l que pasta no projeto gerado se refere ao modulo EJB? .

Um forte abraço.

ukaliko.

M

ukaliko:
maurenginaldo:
Oi Alessandro, mais um vez obrigado pela força.

Consegui resolver o problema, o cenário foi o seguinte:

Estava criando um projeto Seam WAR e colocando os componentes Seam/EJB dentro dele. Cheguei inclusive a criar um projeto Seam EAR mas colocando os componentes Seam/EJB dentro do projeto WEB. Trocando idéia com outro colega ele me disse que os seam/EJB’s tem que estar dentro do projeto EJB. Criei um projeto Seam EAR e coloquei os componentes seam/EJB dentro do módulo EJB e funcionou blz!!!
Um pequeno desconhecimento da arquitetura que me custou alguns dias.

Obrigado a todos.

Caro maurenginaldo.
Blzaa. Estou com um problema idêntico ao teu, Estou iniciando no seam agora e confeço que to meio perdido na arquitetura gerada pelo jboss sem, Mas me da uma força ai… daria pra ser mais claro no que vc fez pra resolver o problema.
Tipo: Onde fica os arquivos seam/EJBs? para onde tenho que copia-los? l que pasta no projeto gerado se refere ao modulo EJB? .

Um forte abraço.

ukaliko.

Opa, vamos lá.

Instale o plugin JBoss Tools no seu Eclipse e crie um “Seam Project”. Quando chegar no final do wizard para criação do projeto, tem uma opção para marcar se o seu projeto será WAR ou EAR. Marque EAR e será criado um projeto EAR que agrupa um projeto WEB, um projeto EJB e um projeto teste. Os seus arquivos EJB/SEAM devem ficar no projeto EJB.

F

Pessoal li todos os post anteriores, mas infelizmente continuo com o problema.
Tenho dois projetos EAR, os dois compostos por EJB.

No projeto A exportei os seus EJBs para uma jar, fazendo a sua inclusão no projeto B.
Em uma derterminada classe do projeto B tento fazer o inject do EJB do projeto A e dá a mensagem de que não é possível instanciar.

Já tentei de várias maneiras inicializar o meu EBJ do projeto A, por exemplo:

@EJB(beanInterface = ICorporativo.class, beanName = “CorporativoBean”, mappedName = “corporativoseam-ear/CorporativoBean/local”, name = “corporativoseam-ear/CorporativoBean/local”)
CorporativoBean corporativoBean;

ERRO:
java.lang.RuntimeException: Non matching type for inject of field: org.domain.corporativoseam.session.CorporativoBean org.domain.sislocseam.process.actions.LocacaoProcess.corporativoBean for type: $Proxy81 of jndiName env/corporativoseam-ear/CorporativoBean/local
intfs: , org.domain.corporativoseam.session.ICorporativo, org.jboss.ejb3.JBossProxy

  1. @In (create)
    CorporativoBean corporativoBean;

ERRO: não consegue instanciar o ejb

Component component = Seam.componentForName(“corporativo”);
ICorporativo corporativo = (ICorporativo) component.getInstance(CorporativoBean.class);

ERRO: não consegue instanciar

Não sei mais o q fazer, queria saber o q estou fazendo de errado, minhas configurações são:
jboss-seam-2.1.1.GA
jboss-4.2.3.GA

Por favor me ajudem.
Grato

F

Vc se certificou que o os EJBs de um projeto estão visíveis para o outro?

Tenta fazer do modo tradicional, veja se no deploy o AS informa o JNDI name do componente e faça o lookup na mão!

Abraço

D

Vai uma sugestão…

Pq uma pessoa que já conseguiu configurar(colocar o EJB 3 para funcionar no SEAM) não disponibiliza um *projeto para as pessoas?

  • Projeto simples, protótipo, enfim… algo que as pessoas possam se basear.
F

danbrasileiro:
Vai uma sugestão…

Pq uma pessoa que já conseguiu configurar(colocar o EJB 3 para funcionar no SEAM) não disponibiliza um *projeto para as pessoas?

  • Projeto simples, protótipo, enfim… algo que as pessoas possam se basear.

Pq com o seam-gen isso é moleza…
E

Eu consegui resolver este problema transformando o componente num EJB Stateless (no meu caso). Usando JBoss 5 + Seam 2.1.

Depois de anotar a classe com @Stateless e implementar a intereface, o @EJB passou a funcionar.

Acredito que, para acessar de outra forma precisaria usar algum mecanismo do próprio Seam, mas como começei a mexer nisso faz 2 dias não sei dizer exatamente. O importante é resolver o problema :stuck_out_tongue:

Att.
Edson.

R

estou com o mesmo problema…

alguem pode me ajudar por favor como resolver isso?

E

Olá, posta ai um exemplo de como está tentanto fazer.

Att.
Edson.

R

VOu postar amanha, agora tou em casa… ai posto aqui… valeu

R

bom estou utilizando JBOSS PORTAL + JBOSS SEAM

lá vai… é um exemplo básico do livros projetos praticos Jboss seam…

GadgetBean.java

/*
 * Copyright 2006 James A Farley
 */
package com.citespace.test;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.jboss.seam.annotations.Name;

@Entity
@Table(name="GADGET")
@Name("gadget")
public class GadgetBean implements Serializable {
	private long mId;
    private String mDescription = "";
    private String mType = "";
    
    public GadgetBean() { }
    
    @Id @GeneratedValue
    @Column(name="GADGET_ID")
    public long getId() {
    	return mId;
    }
    
    public void setId(long id) {
    	mId = id;
    }
    
    @Column(name="DESCR")
    public String getDescription() {
        return mDescription;
    }
    
    public void setDescription(String desc) {
        mDescription = desc;
    }

    @Column(name="TYPE")
    public String getType() {
        return mType;
    }

    public void setType(String t) {
        mType = t;
    }

    @Transient
    public Map<String,String> getGadgetTypes() {
        Map<String,String> types = new HashMap<String,String>();
        for (GadgetType value : GadgetType.values()) {
            types.put(value.label(), value.name());
        }
        return types;
    }
}

GadgetAdminBean.java

/*
 * Copyright 2006 James A Farley
 */
package com.citespace.test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

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

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;

@Stateless
@Name("gadgetAdmin")
public class GadgetAdminBean implements IGadgetAdminBean {
    @PersistenceContext(unitName="gadgetDatabase")
    private EntityManager mEntityManager;
    
    @In(value="gadget", create=true)
    private GadgetBean mActiveGadget;

	public GadgetBean getActiveGadget() {
		return mActiveGadget;
	}

	public void setActiveGadget(GadgetBean activeGadget) {
		mActiveGadget = activeGadget;
	}
    /** Retrieve all gadgets from the catalog, ordered by description */
    public List<GadgetBean> getAllGadgets() {
        List<GadgetBean> gadgets = new ArrayList<GadgetBean>();
        
        try {
            Query q = 
                mEntityManager.createQuery("select g from GadgetBean as g order by g.description");
            List<?> gList = q.getResultList();
            Iterator<?> i = gList.iterator();
            while (i.hasNext()) {
                gadgets.add((GadgetBean)i.next());
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return gadgets;
    }

    /** Insert the gadget just created/edited into
     *  the catalog
     */
    public String newGadget() {
    	newGadget(getActiveGadget());
    	return "success";
    }
    
    /** Insert a new gadget into the catalog */
    public void newGadget(GadgetBean g) {
        try {
            mEntityManager.persist(g);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

addGadget.xhtml -->> Ele é chamado inicialmente no JBOSS PORTAL

<!DOCTYPE composition 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:s="http://jboss.com/products/seam/taglib"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    template="layout/template.xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:rich="http://richfaces.org/rich">
    <ui:define name="body">

    <h:form id="HelloForm">

        <rich:panel>
            <f:facet name="header">Hello World</f:facet>
           
     		<p>Please type the description and type bellow:</p>

            <div class="dialog">
                <h:panelGrid columns="2" rowClasses="prop" columnClasses="name,value">
                	<h:outputLabel for="description">Description</h:outputLabel>
                    <h:inputText id="description"
                              value="#{gadget.description}" required="true"/>
                    <h:outputLabel for="type">Type</h:outputLabel>
                    <h:selectOneMenu  id="type" value="#{gadget.type}" required="true">
							<f:selectItems value="#{gadget.gadgetTypes}"/>
					</h:selectOneMenu>  
					<h:commandButton action="#{gadgetAdmin.newGadget}" value="Create" type="submit" />       
                </h:panelGrid>
            </div>
        </rich:panel>
    </h:form>
     </ui:define>
</ui:composition>

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xi="http://www.w3.org/2001/XInclude"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
 <managed-bean>
  <managed-bean-name>gadget</managed-bean-name>
  <managed-bean-class>com.citespace.test.GadgetBean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>
 <managed-bean>
  <managed-bean-name>gadgetAdmin</managed-bean-name>
  <managed-bean-class>com.citespace.test.GadgetAdminBean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>
 <navigation-rule>
        <navigation-case>
            <from-outcome>success</from-outcome>
            <to-view-id>/gadgetList.xhtml</to-view-id>
        </navigation-case>
       
    </navigation-rule>
 <application>
  <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
  <state-manager>org.jboss.portletbridge.application.PortletStateManager</state-manager>
  <locale-config>
   <default-locale>en</default-locale>
   <supported-locale>bg</supported-locale>
   <supported-locale>de</supported-locale>
   <supported-locale>en</supported-locale>
   <supported-locale>fr</supported-locale>
   <supported-locale>tr</supported-locale>
  </locale-config>
 </application>
</faces-config>

portlets-instances.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE deployments PUBLIC 
"-//JBoss Portal//DTD Portlet Instances 2.6//EN"
"http://www.jboss.org/portal/dtd/portlet-instances_2_6.dtd">
<deployments>
	<deployment>
		<instance>
			<instance-id>SeamPortletInstance</instance-id>
			<portlet-ref>citeSpaceRealTest</portlet-ref>
		</instance>
	</deployment>
	<deployment>
		<instance>
			<instance-id>GadgetProjectPortletInstance</instance-id>
			<portlet-ref>gadgetPratico</portlet-ref>
		</instance>
	</deployment>
</deployments>

portlets.xml

<?xml version="1.0" encoding="UTF-8"?>
<portlet-app
	xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd"
	version="2.0">

	<portlet>
		<portlet-name>citeSpaceRealTest</portlet-name>
		<display-name>JBoss Seam Portlet</display-name>
		<portlet-class>
			javax.portlet.faces.GenericFacesPortlet
		</portlet-class>
		<init-param>
			<name>javax.portlet.faces.defaultViewId.view</name>
			<value>/home.xhtml</value>
		</init-param>
		<supports>
			<mime-type>text/html</mime-type>
			<portlet-mode>VIEW</portlet-mode>
		</supports>
		<portlet-info>
			<title>JBoss Seam Portlet</title>
		</portlet-info>
	</portlet>
	<portlet>
		<portlet-name>gadgetPratico</portlet-name>
		<display-name>GadgetProjectPortletPratico</display-name>
		<portlet-class>
			javax.portlet.faces.GenericFacesPortlet
		</portlet-class>
		<init-param>
			<name>javax.portlet.faces.defaultViewId.view</name>
			<value>/addGadget.xhtml</value>
		</init-param>
		<supports>
			<mime-type>text/html</mime-type>
			<portlet-mode>VIEW</portlet-mode>
		</supports>
		<portlet-info>
			<title>GadgetProjectPortlet</title>
		</portlet-info>
	</portlet>
</portlet-app>

page.xml

<?xml version="1.0" encoding="UTF-8"?>
<pages xmlns="http://jboss.com/products/seam/pages"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.1.xsd"

       no-conversation-view-id="/home.xhtml"
       login-view-id="/login.xhtml">

    <page view-id="*">
        <navigation>
            <rule if-outcome="home">
                <redirect view-id="/home.xhtml"/>
            </rule>
        </navigation>
    </page>

    <exception class="org.jboss.seam.framework.EntityNotFoundException">
        <redirect view-id="/error.xhtml">
            <message severity="warn">Record not found</message>
        </redirect>
    </exception>
    
    <exception class="javax.persistence.EntityNotFoundException">
        <redirect view-id="/error.xhtml">
            <message severity="warn">Record not found</message>
        </redirect>
    </exception>
    
    <exception class="javax.persistence.EntityExistsException">
        <redirect view-id="/error.xhtml">
            <message severity="warn">Duplicate record</message>
        </redirect>
    </exception>
    
    <exception class="javax.persistence.OptimisticLockException">
        <end-conversation/>
        <redirect view-id="/error.xhtml">
            <message severity="warn">Another user changed the same data, please try again</message>
        </redirect>
    </exception>
    
    <exception class="org.jboss.seam.security.AuthorizationException">
        <redirect view-id="/error.xhtml">
            <message severity="error">You don't have permission to access this resource</message>
        </redirect>
    </exception>
    
    <exception class="org.jboss.seam.security.NotLoggedInException">
        <redirect view-id="/login.xhtml">
            <message severity="warn">#{messages['org.jboss.seam.NotLoggedIn']}</message>
        </redirect>
    </exception>
    
    <exception class="javax.faces.application.ViewExpiredException">
        <redirect view-id="/error.xhtml">
            <message severity="warn">Your session has timed out, please try again</message>
        </redirect>
    </exception>
    
    <exception class="org.jboss.seam.ConcurrentRequestTimeoutException" log-level="trace">
      <http-error error-code="503" />
    </exception>
     
    <exception>
        <redirect view-id="/error.xhtml">
            <message severity="error">Unexpected error, please try again</message>
        </redirect>
    </exception>
    
</pages>

gadgetList.xhtml

<!DOCTYPE composition 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:s="http://jboss.com/products/seam/taglib"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    template="layout/template.xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:rich="http://richfaces.org/rich">
    <ui:define name="body">
	    <rich:panel>
	            <f:facet name="header">Result List</f:facet>
	            <div class="dialog">
	            	<f:view>
	            		<h:dataTable value="#{gadgetAdmin.allGadgets}" var="g">
	            		<h:column>
				  			<f:facet name="header">
				  				<h:outputText value="Type" />
				  			</f:facet>
				  			<h:outputText value="#{g.type}" />
				  		</h:column>
				  		<h:column>
				  			<f:facet name="header">
				  				<h:outputText value="Description" />
				  			</f:facet>
				  			<h:outputText value="#{g.description}" />
				  		</h:column>	
	            		
	            		</h:dataTable>
	            		<h:form>
	            			<h:commandLink action="addGadget">
				  				<h:outputText value="Add a new gadget" />
				  			</h:commandLink>
	            		</h:form>
	            	</f:view>
	            </div>
	    </rich:panel>
    </ui:define>
    </ui:composition>

GadgetType.java

package com.citespace.test;

public enum GadgetType { 
    MOBILE_PHONE("Mobile phone"), 
    MEDIA_PLAYER("Personal media player"), 
    LAPTOP("Laptop/notebook"), 
    GPS("GPS");

    private final String mLabel;
    GadgetType(String desc) {
        this.mLabel = desc;
    }

    public String label() { return mLabel; }
};

Cara está ae, será que consegue ajudar ou precisa de mais alguma informação?

R
15:26:34,330 ERROR [LifecyclePhase] Error executing INVOKE_APPLICATION 5 phase.
15:26:34,335 ERROR [SeamExceptionHandlerImpl] Error processing action lifecycle
javax.faces.FacesException: org.jboss.seam.InstantiationException: Could not instantiate Seam component: gadgetAdmin

Erro que está dando quando rodo o programa é este… tem mais uma cacetada de coisa mas começa ae…

J

Muito bacana a discursão de vocês, mas, ainda estou recebendo o erro "“Could not instantiate Seam component: usuarioEJB”.

Então, depois de ler isso tudo 2 vezes, pergunto a vocês, é possível acessar um EJB Local, que obviamente, está no projeto EJB, não
no projeto WEB, de dentro do projeto WEB?!

Se existe uma maneira, explicai a mim, pois não consegi ainda tamanha proeza!

Criei o meu projeto usando o jbosstools, plugin. Tenho um projeto EJB, onde estão minhas entidades e os meus EJBs.
Tenho o meu projeto Web, que é onde tenho os ‘ManagedBeans’. Todos descritos acima são componentes Seam, em outras palavras,
todos estão anotados com @Name.

Ajudem-me, sim!?

Segue o simples código desenvolvido:

@Stateful
@Name("usuarioEJB")
public class UsuarioEJB implements IUsuarioLocal {
	
	@PersistenceContext
	private EntityManager entityManager;

	public void inserir(Usuario usuario) {
		entityManager.persist(usuario);
	}

	public Usuario alterar(Usuario usuario) {
		return entityManager.merge(usuario);
	}

	public void excluir(Usuario usuario) {
		entityManager.remove(usuario);
	}

	public Usuario consultarPorId(Usuario usuario) {
		return entityManager.find(Usuario.class, usuario.getId());
	}
	
	@Remove
	@Destroy
	public void cleanUp() { }
}
@Name("usuarioMB")
@Scope(ScopeType.CONVERSATION)
public class UsuarioMB implements Serializable {
	
	private static final long serialVersionUID = 2162523338663188098L;
	
	private Usuario usuario;
	
	@In
	private UsuarioEJB usuarioEJB;
	
	
	public String inserir() {
		usuarioEJB.inserir(usuario);
		setUsuario(null);
		return null;
	}

	public Usuario alterar() {
		setUsuario(null);
		return null;
	}

	
	/*
	 * Getters e Setters
	 ***/
	@Begin(join=true)
	public Usuario getUsuario() {
		if(this.usuario == null) {
			this.usuario = new Usuario();
		}
		return usuario;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

}
J

edit

Criado 5 de dezembro de 2007
Ultima resposta 29 de mai. de 2013
Respostas 37
Participantes 13