[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: [reverbel-sma] 3 problemas



Olá Daniel.

On 9/22/06, Daniel Creão <ldaugusto@xxxxxxxxx> wrote:
Desde segunda ainda não entreguei meu EP pq não consigo solucionar 3
problemas, e ainda entender como fazer o Servlet (ja q nunca tinha feito
um). Depois de muito bater cabeça e perceber que já deveria ter postado isso
faz tempo, eis meus problemas:

1) Enterprise Archive
Inicialmente, montei um sma-all.ear com os EJBs + Servelt, separados em
sma-ejb.jar (com seu META-INF/persistence.xml) e sma-web.jar (com seu
WEB-INF com jboss-web.xml, web.xml e as classes no diretorio classes).
Separadamente, eles funcionam normalmente. Entretanto, quanto os coloco no
ear com um application.xml, os nomes no JNDI mudam e não consigo acessa-los.

+- CourseManagerBean (class: org.jnp.interfaces.NamingContext)
  |   +- localStatefulProxyFactory (class:
org.jboss.ejb3.stateful.StatefulLocalProxyFactory)
  |   +- local (class: java.lang.Object)
  |   +- remote (class: java.lang.Object)
  |   +- remoteStatefulProxyFactory (proxy: $Proxy76 implements
interface org.jboss.ejb3.ProxyFactory)
+- SystemAdminBean (class: org.jnp.interfaces.NamingContext)
  |   +- local (proxy: $Proxy151 implements interface
sma.interfaces.SystemAdminLocal,interface
org.jboss.ejb3.JBossProxy,interface javax.ejb.EJBLocalObject)
  |   +- remote (proxy: $Proxy150 implements interface
sma.interfaces.SystemAdminRemote,interface
org.jboss.ejb3.JBossProxy,interface javax.ejb.EJBObject)

Para:

+- sma-all (class: org.jnp.interfaces.NamingContext)
  |   +- SystemAdminBean (class: org.jnp.interfaces.NamingContext)
  |   |   +- local (proxy: $Proxy135 implements interface
sma.interfaces.SystemAdminLocal,interface
org.jboss.ejb3.JBossProxy,interface javax.ejb.EJBLocalObject)
  |   |   +- remote (proxy: $Proxy134 implements interface
sma.interfaces.SystemAdminRemote,interface
org.jboss.ejb3.JBossProxy,interface javax.ejb.EJBObject)
  |   +- CourseManagerBean (class: org.jnp.interfaces.NamingContext)
  |   |   +- remote (class: java.lang.Object)
  |   |   +- remoteStatefulProxyFactory (proxy: $Proxy76 implements
interface org.jboss.ejb3.ProxyFactory)


Mudei todos os lookups de: ref = jndiContext.lookup ("CourseManagerBean/remote") para ref = jndiContext.lookup("sma-all/CourseManagerBean/remote") E não funciona. A mesma coisa com SystemAdminBean.

Meu application.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<application>
    <display-name>SMA: EP1</display-name>
        <module>
            <web>
                <web-uri>sma-web.war</web-uri>
                <context-root>/courses</context-root>
            </web>
        </module>
        <module>
            <ejb>sma-ejb.jar</ejb>
        </module>
</application>
Parece estar tudo certo com o seu EP. Qual é o erro que você está obtendo?

Só uma coisa: se você estiver acessando o EJB a partir do servlet,
você deve fazê-lo utilizando a interface local
("sma-all/CourseManagerBean/local") ao invés da interface remota
("sma-all/CourseManagerBean/remote"). Se for um cliente stand-alone
(uma aplicação Java "normal" com um método main), aí você deve acessar
o EJB utilizando a interface remota.

2) Stateful Beans
Eu realmente acho que não entendi os Stateful beans. Como o estado da sessão
é salvo? A classe que é um Stateful bean precisa implementar
java.io.Serializable? Todas as alterações que faço nas minhas classes dentro
do Stateful Bean desaparecem ao encerrar a aplicação, mesmo usando merge,
persist ou flush.
Um bean de sessâo com estado não precisa implementar
java.io.Serializable. No bean de sessâo com estado, para que a
referência para o EntityManager continue válida durante várias
requisições, é necessário adicionar a anotação:

@PersistenceContext(type = PersistenceContextType.EXTENDED)

Se o seu cliente manipula diretamente as entidades e depois as passa
como parâmetros para o seu bean, tudo o que esse último precisa fazer
para persistir as alterações é chamar EntityManager.merge() passando
uma entidade como parâmetro. Se seu bean recebe como parâmetros os
dados das entidades (os IDs, por exemplo), ele só precisa chamar
EntityManager.find() para obter referências para as entidades e
alterá-las. Nesse caso as alterações serão automaticamente persistidas
quando o método for encerrado (na verdade quando a transação corrente
for encerrada, o que ocorre logo após o final da execução do método).

3) Servlet
Tentei usar dentro do Servlet a mesma chamada que uso no cliente do
estudente para fazer a chamada da interface, mas tudo o que consigo são
repetidos ClassCastException. Olhando dentro do JNDI, vejo que
CourseManagerBean/remote consta como se fosse só Object (e que dá erro no
momento do casting), enquanto SystemAdminBean/remote não. Por que isto não
funciona dentro de um Servlet, mas funciona fora dele?

            jndiContext = new javax.naming.InitialContext();
            ref = jndiContext.lookup("CourseManagerBean/remote");
            manager = (CourseManagerRemote) ref
Porque um servlet roda na mesma máquina virtual que o seu EJB.
Utilizando a interface remota, todos os parâmetros têm que ser
seriados e deseriados para todas as chamadas. No caso da interface
local, os parâmetros podem ser passados por referência, o que leva a
um melhor desempenho. Todo componente Java EE que executa na máquina
virtual do servidor de aplicações deve utilizar a interface local do
EJB.

4) JBoss

Esse não conta nos erros que queria listar, mas ele constantemente aparece
no console do JBoss, então pode significar algo:

ERROR [JNDIView] JNDIView.getHAJndiAttributes() failed
Isso aparece para mim também. Não tem nada a ver com o seu EP.

Qualquer dúvida por favor volte a escrever.

--
Ivan Neto