我正在努力使用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";
}
我希望有人知道我能检查什么。不得不改变立面+服务名称。 : - / 问候 米
答案 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的答案,因为它包含更多有用的信息。非常感谢!