У меня есть приложение EJB, использующее модуль сохраняемости OpenJPA из WebSphere 8.5. DataSource настраивается в WebSphere со следующими параметрами:
- Имя: MYAPP_001
- Имя JNDI: jdbc/MYAPP/DS001
- Псевдоним проверки подлинности, управляемый компонентом: MYAPP_001.
- Псевдоним конфигурации сопоставления: (нет)
- Псевдоним проверки подлинности, управляемый контейнером: (нет)
- Формат java:comp/env/ представляет собой ссылку на ресурс, поэтому вы должны каким-то образом определить его. У вас есть несколько вариантов, чтобы не определять фиктивный источник данных:
Блок сохраняемости настроен так:
<?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@PersistenceContext(name = "myapp")
private EntityManager em;
0.xsd"
version="2.0">
<persistence-unit name="myapp" transaction-type="JTA">
<jta-data-source>java:comp/env/jdbc/MYAPP/DS001</jta-data-source>
<class>...</class>
<properties>
...
</properties>
</persistence-unit>
</persistence>
Теперь я импортирую его в EJB:
@PersistenceContext(name = "myapp")
private EntityManager em;
Проблема в том, что при следующей конфигурации источник данных не может быть разрешен:
Что мне нужно, так это обеспечить сопоставление ресурсов
DataSource
в любом из EJB, используяEntityManager
:
Это очень неэлегантное решение для меня, потому что:
@Resource(name = "java:comp/env/jdbc/MYAPP/DS001", lookup = "jdbc/MYAPP/DS001", shareable = true, authenticationType = Resource.AuthenticationType.CONTAINER)
private DataSource ds;
Это очень запутанно. Его нужно объявить только один раз в любом компоненте EJB, использующем @PersistenceContext
. Тот DataSource
может вообще не использоваться в коде Java, и в моем случае он не используется. Будет трудно понять, что делает это объявление в этом файле и почему оно только в одном файле.
Это дублирование конфигурации, предоставленной в другом месте. Мне нужно еще раз указать имя ресурса (оно уже было указано в файле persistance.xml).
Это сохранение конфигурации в исходном коде. Довольно грязный антипаттерн.
Технически для этого требуется
javax.annotation.Resource
из Java 7, в то время как мой проект использует Java 6. Но среда выполнения WebSphere изменила версию этой аннотации, поэтому все работает, но требует компиляции с помощью javac из среды выполнения WebSphere вместо стандартного JDK.Можно ли избавиться от этой аннотации? Что мне нужно использовать в качестве альтернативы?
Область: ячейки:pxxxxNodexxCell