[RESOLVIDO] DataSource no GlassFish + Erro no Deploy de EJB

Pessoal,

Instalei o GlassFish V2 hoje de 9h da manhã e, desde então, estou tentando migrar (antes no JBoss 4.2.2.GA) uma aplicacao super simples (exemplo do livro do Bill Burke), soh com um EJB. Tudo ia muito bem até a hora de fazer o deploy do ejb-jar… No momento do deploy o GlassFish não está encontrando o DataSource registrado com o nome informado no jta-data-source (do persistence.xml). Desde 9h até agora estou tentando fazer o deploy desse danado… por um lado foi bom pois aprendi um monte de coisa nao necessariamente ligada ao problema, por outro, foi ruim pois ainda nao consegui soluciona-lo rss.

No JBoss estava funcionando… para configurar o DataSource foi soh colocar um arquivo cruise-ds.xml no diretório deploy e no persistence.xml, na tag jpa-data-source, colocar java:/CruiseDS (nome do jndi configurado no cruise-ds.xml).

No GlassFish cadastrei o pool de conexoes pelo Admin Console e, através do mesmo, fiz um teste de conexao, que foi bem sucedido.

Até aqui, acredito, então que o DataSource está configurado corretamente. Porém, na hora do Deploy, recebo uma mensagem de que o EJB não foi implantado com sucesso devido a algum erro indicado no log (mais abaixo coloco a mensagem do log).

Dada a descrição geral, vamos com mais detalhes:

O arquivo ejb-jar tem apenas uma entidade mapeada com JPA, uma interface remota e uma implementação @Stateless da mesma. Segue o persistence.xml:

<persistence ...>
	<persistence-unit name="CruiseEJB">
		<jta-data-source>java:/CruiseDS</jta-data-source>
		
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
		</properties>
	</persistence-unit>
</persistence>

Segue a configuração no Glassfish equivalente ao cadastrar o DataSource pelo Admin Console (claro que na minha versão, as propriedades user, password e url estão devidamente preenchidos):

<resources>
    <jdbc-connection-pool 
        name="CruiseDS" 
        datasource-classname="org.postgresql.ds.PGSimpleDataSource"
        res-type="javax.sql.DataSource">
        <property name="user" value="DB_USER"/>
        <property name="password" value="DB_PASSWORD"/>
        <property name="url" value="jdbc:postgresql://DB_HOSTNAME/DATABASE_NAME:5432"/>
    </jdbc-connection-pool>
</resources>

Com essas configurações, eu consigo, através do Admin Console, testar a conexão com o pool e o teste é bem sucedido. Porém, no momento do deploy, a seguinte exceção (apenas um trecho do stackTrace) é lançada:

javax.naming.NameNotFoundException: No object bound to name java:/CruiseDS
java.lang.RuntimeException: javax.naming.NameNotFoundException: No object bound to name java:/CruiseDS

Como estou começando agora com EJB, não sei se o nome no persistence.xml está correto… o prefixo “java:/” informar em jta-data-source (“java:/CruiseDS”) é padrão EJB ou seria especifico do JBoss e no GlassFish seguiria outro padrão? Do jeito que está, deveria funcionar (provavelmente, não… ou seria algum bug do glassfish, o que acho pouquissimo provável)?

No momento em que escrevia esse tópico, notei que no meu persistence.xml eu coloco uma propriedade relacionada ao Hibernate e, pelo que lembro ter lido em outros topicos, o GlassFish na verdade vem com o TopLink como default.

Sei que no caso do JBoss + Hibernate é necessário informar explicitamente o dialect… no caso do TopLink tem algo relacionado a isso? alguma propriedade que deve ser colocada no persistence.xml? Isso poderia ser a causa do problema de não estar achando o DataSource no momento do deploy (acredito que não, mas…)?

Cara, se não me engano, o que você fez foi criar um pool de conexões e testá-lo (creio eu que você clicou na opção ping na tela de configuração do pool). O próximo passo seria registrar esse novo pool criado para ser resgatado via JNDI. Isso você consegue acessado as seguintes opções:

-> Escolha o elemento Resources localizado na raiz do menu do application server;
-> Depois escolha a opção JDBC Resources;
-> Na tela que aparecer na direita, clique no botão "new" para registrar o pool de conexões criado no JNDI;

Pronto…testa para ver se faltava somente esse passo e dá um toque depois…

Vlw!

Poxa, era isso mesmo… o pior foi que eu vi essa a opção do JDBC Resource… mas achei que não era necessário… não cheguei a clicar no new… la tem até um campo para colocar o JNDI name…

O pior tb foi que eu vi a outra possibilidade de registrar o pool, que é copiando um xml do template para um diretorio qualquer, editar os dados necessário para conexao e, via console, digitar add-resources <caminho_xml> … e nesse template tb tem a opcao de JDBC-Resource que eu acabei comentando de propósito, achando que isso n seria necessário hehehe… que vacilo meu … sabia que tinha que ser algo tao simples, pois nao havia outras pessoas com essa mesma duvida por aih.

Muito obrigado… fazia um tempao que eu tava tentando e eu nunca conseguiria, pois eu sempre evitava configurar o JDBC Resource hehehe

Abraços.

Tinha colocado um erro aqui, mas ta Ok… tudo funcionando agora… valeu!