2013-08-29 5 views
1

Я борюсь с 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

+0

После дополнительного анализа кажется, что WAS не загружает EJB. Наша упаковка - это ухо-> war-> jar с услугами ejbs & rest. Тем не менее, он распознает аннотации Rest. Таким образом, EJB Annotation не удается, а Inject Annotation просто доставила POJO и ввела EntityManager. Конечно, управление транзакциями EJB было и отсутствует. : -/ – mkuff

ответ

0

@mkuff - Я разрабатываю проект уха, который нацелен на WAS v8.0.0.7.

Все, что мне нужно, чтобы получить EJB правильно сконфигурированный это:

import javax.ejb.Stateless; 
import javax.inject.Inject; 
import javax.persistence.EntityManager; 
@Stateless 
public class StateInfo { 
    @Inject 
    @SomeDatabase 
    private EntityManager em; 

Чтобы загрузить БЫЛ 8.xx библиотеки, мой Maven POM использует зависимость:

<dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-api</artifactId> 
     <version>6.0</version> 
     <scope>provided</scope> 
    </dependency> 

Что касается @ Аннотации SomeDatabase ... это присутствует, потому что я использую CDI WAS (OpenWebBeans). Вот мой Классификатор:

import javax.inject.Qualifier; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

import static java.lang.annotation.ElementType.FIELD; 
import static java.lang.annotation.ElementType.METHOD; 
import static java.lang.annotation.ElementType.TYPE; 

/** 
* @author Chris Harris 
* 
*/ 
@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
@Target({FIELD, TYPE, METHOD}) 
public @interface SomeDatabase {} 

Затем я использую Производитель:

import javax.enterprise.inject.Produces; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

/** 
* @author Chris Harris 
* 
*/ 
public class JPAResourceProducer { 
@SuppressWarnings("unused") 
@Produces 
@PersistenceContext(unitName = "somePuName") 
@SomeDatabase 
private EntityManager em; 
} 

Вот мой persistence.xml:

<?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="somePuName" transaction-type="JTA"> 
    <jta-data-source>java:comp/env/someDb</jta-data-source> 

Вот соответствующая часть web.xml:

<resource-ref id="someDb"> 
    <res-ref-name>someDb</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    <res-sharing-scope>Shareable</res-sharing-scope> 
</resource-ref> 

И, наконец, ibm-web-bnd.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-bnd 
xmlns="http://websphere.ibm.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_1.xsd" 
version="1.1"> 

<virtual-host name="default_host" /> 

<resource-ref name="someDb" binding-name="jdbc/someDb" /> 

У меня есть DataSource, определенный в том, что используется имя JDBC/someDb.

0

Основная причина была ошибкой в ​​websphere в сочетании с отсутствующим массивом классов, возвращаемым из класса конфигурации приложения Rest. Когда наш EJB реализовал интерфейс, он просто больше не работал. EJB не распознан и никаких транзакций не началось.

Я отметил ответ Chriss, потому что он содержит более полезную информацию. Большое спасибо за это!

+0

Можете ли вы предоставить ссылку на информацию об ошибке WebSphere? – cjackson

Смежные вопросы