Obter datasource do JBoss (com use-java-context=true) via JNDI com JPA [RESOLVIDO]

E aí pessoal, blz? Seguinte, estou com uma aplicação Web (que usa JPA) e preciso obter o datasource via JNDI. Até aí nada de anormal mas, quando se deixa o parâmetro use-java-context no datasource do JBoss com o valor true, a aplicação não encontra o datasource nem na base do grito! :lol: O pessoal da infra deixa o valor do use-java-context false por questões de segurança.

Alguém já passou por situação parecida?

Ah! Antes que perguntem: sim, se colocar false no use-java-context funciona.

Seguem persistence.xml e o datasource.

persistence.xml

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

	<persistence-unit name="app"  transaction-type="RESOURCE_LOCAL">
       	        <provider>org.hibernate.ejb.HibernatePersistence</provider>

		<non-jta-data-source>java:jdbc/app</non-jta-data-source>

		<properties>
		    <property name="hibernate.hbm2ddl.auto" value="none" />
		    <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
		    <property name="hibernate.max_fetch_depth" value="3" />
		    <property name="hibernate.connection.release_mode" value="after_transaction" />
		</properties>
	</persistence-unit>	
</persistence>

app-ds.xml

	<local-tx-datasource>
		<jndi-name>jdbc/app</jndi-name>
		<connection-url>URL_BANCO</connection-url>
		<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
		<user-name>appuser</user-name>
		<password>appsenha</password>
		<min-pool-size>0</min-pool-size>
		<max-pool-size>5</max-pool-size>
		<prepared-statement-cache-size>0</prepared-statement-cache-size>
		<blocking-timeout-millis>180000</blocking-timeout-millis>
		<idle-timeout-minutes>3</idle-timeout-minutes>
		<track-statements>true</track-statements>
		<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
		<metadata>
			<type-mapping>oracle</type-mapping>
		</metadata>
	</local-tx-datasource>

Paz e bem!

E qual o impacto de deixar false?

Vc deixa o datasource público e “qualquer um” pode obtê-lo. Inclusive de uma aplicação standalone.

Boa maneira de “ferrar” com a sua base de dados. :lol:

Paz e bem!

Dá algum erro quando seta pra true?

A exception default para datasource não encontrado

Paz e bem!

Pessoal, achei uma solução! Ainda não sei ao certo o pq (deve ser uma particularidade do JBoss) mas, funcionou! Tive que criar o datasource como se cria para o Tomcat mas, usando o jboss-web.xml. Segue o link de onde achei a solução e como ficaram meus arquivos.

Segue o link: http://forums.oracle.com/forums/thread.jspa?threadID=1155649&tstart=-2

O que foi adicionado ao web.xml :

<resource-ref>
        <description>Banco de Dados</description>
        <res-ref-name>jdbc/app</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
</resource-ref>

Arquivo jboss-web.xml :

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
    <context-root>/app</context-root>
    <resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/app</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <jndi-name>java:jdbc/app</jndi-name>
        <res-auth>Container</res-auth>
    </resource-ref>
</jboss-web>

Meu persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>  
<persistence xmlns="http://java.sun.com/xml/ns/persistence"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">  
  
    <persistence-unit name="app"  transaction-type="RESOURCE_LOCAL">  
        <provider>org.hibernate.ejb.HibernatePersistence</provider>  
  
        <non-jta-data-source>java:jdbc/app</non-jta-data-source>  
  
        <properties>  
            <property name="hibernate.hbm2ddl.auto" value="none" />  
            <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />  
            <property name="hibernate.max_fetch_depth" value="3" />  
            <property name="hibernate.connection.release_mode" value="after_transaction" />  
        </properties>  
    </persistence-unit>     
</persistence>  

Valeu!