从JBoss 7迁移到WildFly 9时使用CMT的EJB

Has*_*lah 7 transactions ejb-3.0 java-ee-6 jboss7.x wildfly-9

我正在将我的应用程序从JBoss 7迁移到WildFly(v9.0.1),并且由于bean事务管理错误而未部署它.

    Caused by: javax.naming.NamingException: WFLYNAM0062: Failed to lookup env/com.component.eventmgt.EventServiceImpl/transaction [Root exception is java.lang.RuntimeException: WFLYNAM0059: Resource lookup for injection failed: java:jboss/UserTransaction]
    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:157)
    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:83)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:207)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:193)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:189)
    at org.jboss.as.naming.deployment.ContextNames$BindInfo$1$1.getReference(ContextNames.java:316)
    ... 90 more
Caused by: java.lang.RuntimeException: WFLYNAM0059: Resource lookup for injection failed: java:jboss/UserTransaction
    at org.jboss.as.naming.deployment.ContextNames$BindInfo$1$1.getReference(ContextNames.java:319)
    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:143)
    ... 95 more
Caused by: javax.naming.NameNotFoundException: UserTransaction [Root exception is java.lang.IllegalStateException: WFLYEJB0137: Only session and message-driven beans with bean-managed transaction demarcation are allowed to access UserTransaction]
    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:153)
    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:83)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:207)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:193)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:189)
    at org.jboss.as.naming.deployment.ContextNames$BindInfo$1$1.getReference(ContextNames.java:316)
    ... 96 more
Run Code Online (Sandbox Code Playgroud)

这是EventServiceImpl类.

    @Stateless
    @Remote(EventService.class)
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public class EventServiceImpl implements EventService {

        /**
         * Logger
         */
        private static Logger log = LoggerFactory.getLogger(EventService.class);

        private EventTableDAO eventDao;

        @PersistenceContext(unitName = "SOMF-GT")
        private EntityManager entityManager;

        @Resource
        private UserTransaction transaction;

       public List<Map> loadEvents() throws EventsException {

        Configuration configurationEntry = new Configuration();
        try {
            Map configuration = configurationService.getConfiguration();
            if (configuration != null) {

        eventDao = new EventTableDAO(Event.class, entityManager, transaction);
        List<Map> eventsMapList = new ArrayList();
}
}
Run Code Online (Sandbox Code Playgroud)

我知道如果我使用@TransactionManagement(TransactionManagementType.BEAN)将事务管理更改为BMT,但随后出现以下错误

WFLYJPA0060:执行此操作需要事务(使用事务或扩展持久性上下文)

我想知道为什么我们必须首先改变这个?

请给我任何信息!

Jon*_*son 4

这些更改在 Wildfly 8 中推出,并且(如下所述)基于 EJB 3.1 中全局 JNDI 命名空间的标准化。

\n

来自 Wildfly 8开发人员指南

\n
\n

EJB 3.1 引入了标准化的全局 JNDI 命名空间和一系列映射到 Java EE 应用程序的各个范围的相关命名空间。用于可移植 JNDI 查找的三个 JNDI 命名空间是 java:global、java:module 和 java:app。如果您在应用程序中使用 JNDI 查找,则需要更改它们以遵循新的标准化 JNDI 命名空间约定。

\n

为了符合新的可移植 JNDI 命名空间规则,您需要检查 JNDI 命名空间规则并修改应用程序代码以遵循这些规则。

\n
\n

该指南进一步指出:

\n
\n

WildFly 8 加强了 JNDI 命名空间名称,为应用程序服务器中绑定的每个名称提供可预测且一致的规则,并防止将来出现兼容性问题。这意味着如果应用程序中的当前命名空间不遵循新规则,您可能会遇到问题。

\n
\n

下面是表中的一个片段,显示了以前版本中的 JNDI 映射示例以及它们现在的具体外观UserTransaction

\n
\n
Previous Namespace          New Namespaces\n------------------          --------------\njava:comp/UserTransaction   java:comp/UserTransaction (This will not be accessible for non EE threads, e.g. Threads your application directly creates)\njava:comp/UserTransaction   java:jboss/UserTransaction (Globally accessible, use this if java:comp/UserTransaction is not available)\n
Run Code Online (Sandbox Code Playgroud)\n
\n

编辑回复:WFLYEJB0137:

\n

这是理论技巧,可能毫无价值 - 请告诉我,我将删除它。Java EE 6 教程 - 容器管理事务说:

\n
\n

使用容器管理的事务划分的企业 Bean 也不得使用 javax.transaction.UserTransaction 接口。

\n
\n

更远:

\n
\n

(交易)必需属性

\n

如果客户端在事务中运行并调用企业 bean\xe2\x80\x99s 方法,则该方法在 client\xe2\x80\x99s 事务中执行。如果客户端未与事务关联,则容器在运行该方法之前启动一个新事务。

\n

required 属性是使用容器管理的事务划分运行的所有企业 Bean 方法的隐式事务属性。除非您需要覆盖另一个事务属性,否则通常不会设置必需属性。由于事务属性是声明性的,因此您以后可以轻松更改它们。

\n
\n

异常消息几乎说明了一切:

\n
\n

WFLYEJB0137:仅允许具有 Bean 管理事务划分的会话和消息驱动 Bean 访问 UserTransaction

\n
\n

您的 EJB 使用容器管理事务 (CMT) 分界,该分界不与 Bean 管理事务 (BMT) 分界互操作,其中UserTransaction

\n

关于转向 BMT 和

\n
\n

WFLYJPA0060:需要事务来执行此操作(使用事务或扩展持久性上下文)

\n
\n

我发现执行此操作需要事务(使用事务或扩展持久性上下文),这似乎表明事务将由您管理,正如您在评论@Marco 中指出的那样。看来你已经做了适当的修改。

\n