/ / Nombre JNDI portátil para DataSource - java, java-ee, jboss, glassfish

Nombre JNDI portátil para DataSource - java, java-ee, jboss, glassfish

Tengo un EJB con campo

@Resource(lookup = "jdbc/sampleDS")
private DataSource ds;

y persistence.xml con entrada

<jta-data-source>jdbc/sampleDS</jta-data-source>

Quiero hacer la aplicación fácil y portátil.A través de diferentes servidores de Java EE. Pero en JBoss, el nombre JNDI debe comenzar con java: / o java: jboss /. Al mismo tiempo, a Glassfish no le gusta el símbolo ":". ¿Cómo lograr la portabilidad? Intenté establecer el atributo use-java-context="false" para la fuente de datos instandalone.xml, pero no me ayudó.

Gracias por adelantado.

Respuestas

1 para la respuesta № 1

El caso es que persistence.xml No se pretende definir sus recursos. Está pensado para hacer referencia a los recursos que se utilizarán para su JTA Entity Manager, sus unidades de persistencia. Sí, en lugar de hacer referencia a un recurso predefinido, puede definir un recurso sobre la marcha, pero eso lo colocará en un contexto específico del contenedor que está utilizando.

Cuando usas persistence.xml para buscar un recurso JNDI predefinido, usaría la siguiente sintaxis:

  <persistence-unit name="mydb" transaction-type="JTA">
<jta-data-source>jdbc/mydb</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>

Al igual que @Resource, la definición de su unidad de persistencia intentará buscar la fuente de datos JDBC desde el contexto existente en java: comp / env.

Tenga en cuenta que para asegurarse de que esos recursos estén disponibles, deben usarse con un resource-ref en tus web.xml. Esto los moverá del contexto global o del contexto de la aplicación a java:comp/env, dándole un nombre JNDI estándar. En el caso de Tomee, por ejemplo, al colocarlo en el resources.xml ya está disponible para su unidad de persistencia, y @Resource etiqueta, pero no en java:comp/env.

Todavía estoy tratando de averiguar cómo Tomee maneja la catalina / tomcat context.xml, por lo que ahora estoy despistado.


0 para la respuesta № 2

Parece que he examinado el tema insuficientemente. Por alguna razón no puedo usar la inyección

@Resource(lookup = "jdbc/sampleDS")

Tengo que buscar la fuente de datos manualmente:

Context ctx = new InitialContext();
dataSource = (DataSource) ctx.lookup("jdbc/sampleDS");

En este caso puedo usar fuentes de datos con atributo. use-java-context="true" y nombre JNDI java:/... o java:jboss/.... Prefijos java:/ y java:jboss/ no se requieren para la unidad de persistencia también.


-1 para la respuesta № 3

Nunca enfrenté tal necesidad, así que no puedo dar unarespuesta directa. Tal vez parezca obvio, pero creo que deberías buscar alguna interfaz Java EE para componer el nombre jndi mediante programación. Si existe, los proveedores deben implementarlo de acuerdo con su propia sintaxis de nombre jndi. No estoy seguro de si es relevante, pero echa un vistazo a esta interfaz y su jerarquía: http://docs.oracle.com/javase/7/docs/api/javax/naming/Name.html