O enterprise bean não pode ser acessado a partir de um servlet, um arquivo JSP, um programa independente ou um outro cliente
Utilize estas dicas de resolução de problemas relacionadas ao acesso de enterprise beans.
- Mensagem java.lang.NoSuchMethodError
- javax.naming.NameNotFoundException: Nome name não localizado na mensagem "local" de contexto quando o acesso é tentado
- BeanNotReentrantException é emitida
- CSITransactionRolledbackException / TransactionRolledbackException é emitida
- A chamada falha, Stack trace beginning EJSContainer E Bean method threw exception [exception_name] localizada no arquivo de log da JVM.
- A chamada falha, ObjectNotFoundException or ObjectNotFoundLocalException when accessing stateful session EJB localizada no arquivo de log da JVM.
- A tentativa de iniciar o módulo EJB falha com a exceção "javax.naming.NameNotFoundException dataSourceName_CMP"
Transação [tran ID] atingiu o tempo limite depois de um erro de 120 segundos acessando o EJB.
A mensagem BBOT0003W é emitida
- Sintoma:CNTR0001W: Um SessionBean com Informação de Estado não pôde se tornar passivo
Sintoma: org.omg.CORBA.BAD_PARAM: O servidor não é do tipo esperado. código secundário: 4942F21E concluído: Não retornado ao programa cliente ao tentar executar um método EJB.
Se o cliente for remoto para o enterprise bean,
isto é, está sendo executado em um servidor de aplicativos diferente ou como um cliente
independente, procure nos logs da JVM do
servidor de aplicativos que hospeda o enterprise bean, assim como nos arquivos de log do
cliente.
Se o cliente for remoto para o enterprise bean, isto é,
está sendo executado em um servidor de aplicativos diferente ou como um cliente independente, procure
nos logs do servidor de aplicativos que hospeda o enterprise bean, assim como nos
arquivos de log do cliente.
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
- Se parecer que o problema está relacionado ao serviço de nomes, isto é, você vê um erro NameNotFoundException ou um ID de mensagem começando com NMSV, consulte estes tópicos para obter mais informações:
- Verifique se o problema está identificado e documentado utilizando os links em Diagnosticando e Resolvendo Problemas: Recursos para Aprendizado.
java.lang.NoSuchMethodError
Ao tentar chamar um método em um Bean de Sessão, ocorreu um java.lang.NoSuchMethodError.
Ao tentar chamar o método xSLTStory4Session em um bean, um java.lang.NoSuchMethodError foi exibido.
CNTR0020E: O EJB emitiu uma exceção inesperada (não-declarada) durante a chamada do método "xSLTStory4Session" no bean "BeanId(ERWW_v8#XSLTStory4SessionEJB3.jar#XSLTStory4SessionFacadeBean, null)".
Dados da exceção: java.lang.NoSuchMethodError: paysession/ejb3/PaySessionFacadeRemote.paySession(Ljava/lang/String;)Ljava/lang/String;
Neste caso, há diversas versões da interface PaySessionFacadeRemote em vários módulos dentro do arquivo EAR. Uma das interfaces não contém o método esperado.
A classe de stub foi gerada pelo tempo de execução a partir da primeira versão da interface PaySessionFacadeRemote no caminho da classe do arquivo EAR que era a versão incorreta.
ObjectNotFoundException ou ObjectNotFoundLocalException ao acessar EJB de sessão com informação de estado
Uma possível causa desse problema é que o bean de sessão com informação de estado teve o tempo limite excedido e foi removido pelo contêiner. Esse evento deve ser tratado no código, de acordo com a especificação EJB 2.1 e posterior.
O Rastreio de Pilha do Método "EJSContainer E Bean Lançou a Exceção [exception_name]" Localizada no Arquivo de Log JVM
Se o nome da exceção indicar uma exceção lançada pela classe IBM que inicia com "com.ibm...", então procure pelo nome da exceção no centro de informações e na ajuda online, conforme descrito. Se o "nome da exceção" indicar uma exceção lançada pelo seu aplicativo, entre em contato com o desenvolvedor de aplicativos par determinar a causa.
javax.naming.NameNotFoundException: Name nome não localizado no contexto "local"
Uma razão possível para esta exceção é que o enterprise bean não é local (não está sendo executado no mesmo Java virtual machine [JVM] ou servidor de aplicativos) para o JSP do cliente, servlet, apliativo Java ou outro enterprise bean, ainda que a chamada seja para um método de interface a "local" do enterprise bean. Se o acesso funcionou em um ambiente de desenvolvimento mas não quando implementado no WebSphere Application Server, pro exemplo, pode ser que o enterprise bean e seu cliente estivessem na mesma JVM em desenvolvimento, mas estejam em processos separados após a implementação.
Para solucionar esse problema, entre em contato com o desenvolvedor do bean corporativo e determine se a chamada do cliente é para um método na interface local do bean corporativo. Caso ela seja, altere o código do cliente para chamar um método de interface remoto, ou para promover o método local para a interface remota.
Referências aos enterprise beans com interfaces locais são limitadas no local do namespace para o processo do servidor com o esquema URL de local:. Para obter um dump de um local de servidor:
namespace, use o utilitário de dump de namespace descrito no artigo "Utilitário de Dump de Espaços de Nomes java:, local: e do servidor".
BeanNotReentrantException é emitida
Esse problema pode ocorrer porque o código do cliente, normalmente um arquivo servlet ou JSP, está tentando chamar o mesmo SessionBean com informações de estado a partir de dois encadeamentos de cliente diferentes. Essa situação geralmente ocorre quando um aplicativo armazena a referência do bean de sessão com estado em uma variável estática, utiliza uma variável JSP global (estática) para fazer referência ao SessionBean com estado, ou armazena a referência do SessionBean com estado no objeto de sessão HTTP. O aplicativo, então, faz com que o navegador cliente emita um novo pedido para o servlet ou arquivo JSP antes do pedido anterior ser concluído.
Para solucionar esse problema, peça ao desenvolvedor do código cliente para rever o código dessas condições.
CSITransactionRolledbackException / TransactionRolledbackException é emitida
Um contêiner de enterprise bean
cria essas exceções de alto nível para indicar que uma chamada de enterprise bean
não foi concluída. Quando essa exceção for emitida, procure os logs da JVM para determinar a causa subjacente.
Um contêiner de enterprise bean
cria essas exceções de alto nível para indicar que uma chamada de enterprise bean
não foi concluída. Quando
essa exceção for emitida, procure os registros para determinar a
causa subjacente.
- O bean corporativo pode emitir uma exceção que não foi declarada como parte de sua assinatura de método. O contêiner terá de reverter a transação nesse caso. Causas comuns dessa situação são quando o bean corporativo ou o código que ele chama cria uma NullPointerException, ArrayIndexOutOfBoundsException, ou outra exceção de tempo de execução Java, ou quando um bean BMP encontra um erro JDBC. A solução é investigar o código do bean corporativo e resolver a exceção subjacente, ou incluir a exceção à assinatura de método do problema.
- Uma transação pode tentar executar trabalho adicional depois de ser posicionada em um estado de "Retrocesso Marcado", "Retrocedendo" ou "Retrocedido". Transações não podem continuar a realizar o trabalho após serem definidas para um desses estados. Essa situação ocorre porque a transação atingiu seu tempo limite, o que ocorre geralmente devido a um conflito de banco de dados. Trabalhe com as ferramentas de gerenciamento de banco de dados do aplicativo ou com o administrador para determinar se as transações do banco de dados chamadas pelo enterprise bean estão atingindo seu tempo limite.
- Uma transação pode falhar na consolidação devido a trabalho pendente de transações locais. A transação local encontrou algum "trabalho pendente" durante a confirmação. Quando uma transação local encontra uma "ação não resolvida", a ação padrão é "retroceder". É possível ajustar esta ação para "confirmar" em uma ferramenta do conjunto.
A Tentativa de Iniciar o Módulo EJB Falha com Exceção "javax.naming.NameNotFoundException dataSourceName_CMP"
- Quando o recurso DataSource foi configurado, a persistência gerenciada por contêiner não foi selecionada.
- Para confirmar esse problema, no console administrativo, navegue nas propriedades da origem de dados dada na NameNotFoundException. No painel Configuração, procure por uma caixa de seleção rotulada como Persistência Gerenciada de Contêner.
- Para corrigir esse problema, selecione a caixa de opções Persistência Gerenciada por Contêiner.
- Se o container managed persistence estiver selecionado, é possível que o
CMP DataSource não tenha sido ligado ao namespace.
Procure avisos ou erros de nomenclatura adicionais na barra de status e nos registros de JVM do servidor de aplicativos de hosting. Verifique qualquer problema de exceção de nomeação adicional que encontrar consultando o tópico Problemas de Acesso ao Aplicativo.
Procure avisos ou erros de nomenclatura adicionais na barra de status e nos registros do servidor de aplicativos de hosting. Verifique qualquer problema de exceção de nomeação adicional que encontrar consultando o tópico Problemas de Acesso ao Aplicativo.
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
A transação [tran ID] atingiu o tempo limite após 120 segundos acessando um enterprise bean
- O valor do tempo limite padrão para transações do bean corporativo é 120 segundos. Após esse período, o tempo limite da transação é atingido e a conexão fecha.
- Se a transação legitimamente levar mais tempo que o período de tempo limite especificado, acesse server_name, selecione a página Propriedades do Serviço de Transações e olhe na propriedade Tempo limite do tempo de vida da transação total. Aumente esse valor, se necessário, e salve a configuração.
![[z/OS]](../images/ngzos.gif)
A mensagem BBOT0003W é emitida
- O valor do tempo limite padrão para transações do bean corporativo é 120 segundos. Após esse período, o tempo limite da transação é atingido e a conexão fecha.
- Se a transação legitimamente levar mais tempo que o período de tempo limite especificado, no console administrativo:
- Vá para
- Selecione a página Propriedades de Serviço de Transação
- Aumente o valor Tempo limite de vida da transação total
- Salve a configuração
Nota: O z/OS utilizará o valor definido para Tempo limite de vida da transação total como a definição de tempo limite da transação padrão. Se você definir um valor para essa propriedade que seja maior que o valor de tempo limite máximo da transação, o z/OS irá utilizar o valor de tempo limite máximo da transação como o padrão.
Sintoma:CNTR0001W: Um SessionBean com Informação de Estado não pôde se tornar passivo
Esse erro pode ocorrer quando um objeto Connection utilizado no bean não é fechado ou anulado.
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
[time EDT] <ThreadID> StatefulPassi W CNTR0001W:
A Stateful SessionBean could not be passivated: StatefulBeanO
(BeanId(XXX#YYY.jar#ZZZZ, <ThreadID>),
state = PASSIVATING) com.ibm.ejs.container.passivator.StatefulPassivator@<ThreadID>
java.io.NotSerializableException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at java.io.ObjectOutputStream.outputClassFields((Compiled Code))
at java.io.ObjectOutputStream.defaultWriteObject((Compiled Code))
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at com.ibm.ejs.container.passivator.StatefulPassivator.passivate((Compiled Code))
at com.ibm.ejs.container.StatefulBeanO.passivate((Compiled Code)
at com.ibm.ejs.container.activator.StatefulASActivationStrategy.atUnitOfWorkEnd
((Compiled Code))
at com.ibm.ejs.container.activator.Activator.unitOfWorkEnd((Compiled Code))
em com.ibm.ejs.container.ContainerAS.afterCompletion((Compiled Code)
em que XXX,YYY,ZZZ é o nome do bean e
<ThreadID> é o ID de encadeamento para essa
execução.![[z/OS]](../images/ngzos.gif)
StatefulPassi W CNTR0001W:
A Stateful SessionBean could not be passivated: StatefulBeanO
(BeanId(XXX#YYY.jar#ZZZZ),
state = PASSIVATING)
java.io.NotSerializableException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at java.io.ObjectOutputStream.outputClassFields((Compiled Code))
at java.io.ObjectOutputStream.defaultWriteObject((Compiled Code))
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at com.ibm.ejs.container.passivator.StatefulPassivator.passivate((Compiled Code))
at com.ibm.ejs.container.StatefulBeanO.passivate((Compiled Code)
at com.ibm.ejs.container.activator.StatefulASActivationStrategy.atUnitOfWorkEnd
((Compiled Code))
at com.ibm.ejs.container.activator.Activator.unitOfWorkEnd((Compiled Code))
em com.ibm.ejs.container.ContainerAS.afterCompletion((Compiled Code)
em que XXX,YYY,ZZZ é o nome do bean.Para corrigir esse problema, o aplicativo deve fechar todas as conexões e definir a referência para null para todas as conexões. Geralmente essa atividade é feita no método ejbPassivate() do bean. Além disso, observe que o bean deve ter código para adquirir novamente essas conexões quando o bean é reativado. Caso contrário, há NullPointerExceptions quando o aplicativo tenta reutilizar as conexões.
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
Sintoma: org.omg.CORBA.BAD_PARAM: Servente não é do tipo esperado. código secundário: 4942F21E concluído: Não
Esse erro pode ser retornado a um programa cliente quando o programa tentar executar um método EJB.
Geralmente, este problema é causado por uma incompatibilidade entre a definição de interface e a implementação das instalações do cliente e do servidor.
Outra possível causa é quando um servidor de aplicativos é configurado para utilizar um único esquema de carregamento de classe. Se um aplicativo for desinstalado enquanto o servidor de aplicativos permanecer ativo, as classes do aplicativo desinstalado ainda serão carregadas no servidor de aplicativos. Se você alterar o aplicativo, implementar novamente e reinstalá-lo no servidor de aplicativos, as classes carregadas anteriormente se tornarão de nível inferior. As classes de nível inferior causam uma incompatibilidade de versão do código entre o cliente e o servidor.
- Altere o esquema de carregamento de classe do servidor de aplicativos para múltiplo.
- Pare e reinicie o servidor de aplicativos e tente a operação novamente.
- Certifique-se de que a versão do código do cliente e do servidor seja igual.