Seam + EJB 3.0, DI?

[quote=maurenginaldo][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]

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

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

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

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.

[quote=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.[/quote]

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.

[quote=ukaliko][quote=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.[/quote]

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.[/quote]

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.

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

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

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.

[quote=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.[/quote]
    Pq com o seam-gen isso é moleza…

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.

estou com o mesmo problema…

alguem pode me ajudar por favor como resolver isso?

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

Att.
Edson.

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

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?

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…

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;
	}

}

edit