Я борюсь с WAS8.5, чтобы использовать простую службу Rest + EJB для вставки объекта в мою базу данных DB2. Выбор работает отлично, потому что транзакции не требуется. Объект правильно аннотирован. (Успешный выбор доказывает, что по крайней мере)WebSphere 8.5 - Rest - нет активных транзакций
Я всегда получаю следующее исключение:
javax.persistence.TransactionRequiredException: No active transaction for PuId=project.ear#included.war#persistence-unit-name
[29.08.13 15:14:59:714 CEST] 00000071 SystemErr R at com.ibm.ws.jpa.management.JPATxEntityManager.getEMInvocationInfo(JPATxEntityManager.java:221)
[29.08.13 15:14:59:714 CEST] 00000071 SystemErr R at com.ibm.ws.jpa.management.JPATxEntityManager.getEMInvocationInfo(JPATxEntityManager.java:179)
[29.08.13 15:14:59:714 CEST] 00000071 SystemErr R at com.ibm.ws.jpa.management.JPAEntityManager.persist(JPAEntityManager.java:143)
[29.08.13 15:14:59:714 CEST] 00000071 SystemErr R at com.TestFacade.testEMInsert(TestFacade.java:72)
Мой persistence.xml (размещенный в META-INF):
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
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_2_0.xsd">
<persistence-unit
name="persistence-unit-name"
transaction-type="JTA">
<!-- <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> -->
<!-- <provider>com.ibm.websphere.persistence.PersistenceProviderImpl</provider> -->
<jta-data-source>jdbc/test-services-ds</jta-data-source>
<class>com.EntityTest</class>
<properties>
<!--<property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>-->
<property name="openjpa.Log" value="SQL=TRACE"/>
<!-- PrintParameters will show query parameters, remove when development has been finished -->
<!-- <property name="openjpa.ConnectionFactoryProperties" value="PrettyPrint=true, PrettyPrintLineLength=72, PrintParameters=true"/> -->
<property name="openjpa.jdbc.Schema" value="LKWSQL"/>
<property name="openjpa.TransactionMode" value="managed"/>
<property name="openjpa.ConnectionFactoryMode" value="managed"/>
<property name="openjpa.jdbc.DBDictionary" value="db2"/>
</properties>
</persistence-unit>
</persistence>
persistence.xml будет читайте, поэтому я думаю, что упаковка уха, похоже, в порядке. Я знаю, что в JavaEE6 война была бы достаточной, но это уже была существующая настройка проекта. Команда перед нами переключилась на управляемые пользователем транзакции, но я надеюсь, что кто-то может помочь мне указать на ошибку.
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED) // default, but was worth a try
@Path("servicepath")
public class TestFacade implements ITestFacade {
@Inject
private SearchService searchService;
@PersistenceContext(unitName="persistence-unit-name")
private EntityManager em;
Служба поиска вызвала первые проблемы. С @EJB это всегда было null. @Inject из CDI работал. Может быть, это ключ?
@GET
@Path("testInsert/")
@Produces({ MediaType.TEXT_PLAIN })
public String testEMInsert() {
try{
System.out.println("testing Insert: " + em.isOpen()); // open is true
EntityTest e = new EntityTest("name");
em.persist(e);
} catch (Exception e){
e.printStackTrace();
return e.getMessage();
}
return "OK";
}
Я надеюсь, что у кого-то есть идея, что я могу проверить. Пришлось менять имена фасадов + службы. : -/ приветствия m
После дополнительного анализа кажется, что WAS не загружает EJB. Наша упаковка - это ухо-> war-> jar с услугами ejbs & rest. Тем не менее, он распознает аннотации Rest. Таким образом, EJB Annotation не удается, а Inject Annotation просто доставила POJO и ввела EntityManager. Конечно, управление транзакциями EJB было и отсутствует. : -/ – mkuff