WebSphere 8.5 - Rest - 没有活动事务

时间:2013-08-29 13:37:29

标签: java rest jpa openjpa websphere-8

我正在努力使用WAS8.5来使用简单的Rest Service + EJB将实体插入到我的DB2数据库中。选择工作正常,因为不需要任何交易。 实体已正确注释。 (成功选择至少证明了这一点)

我总是得到以下异常:

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。来自CDI的@Inject工作。也许这是一个线索?

@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";
 }

我希望有人知道我能检查什么。不得不改变立面+服务名称。 : - / 问候 米

2 个答案:

答案 0 :(得分: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;

要加载WAS 8.x.x库,我的Maven pom使用依赖项:

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

至于@SomeDatabase注释......因为我利用WAS的CDI(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" />

我在WAS中定义了一个使用名称jdbc / someDb。

的DataSource

答案 1 :(得分:0)

根本原因是websphere中的一个错误与Rest Application配置类返回的缺少类数组相结合。 当我们的EJB实现了一个接口时,它就不再起作用了。 EJB未被识别且未启动任何事务。

我标记了Chris的答案,因为它包含更多有用的信息。非常感谢!