代码之家  ›  专栏  ›  技术社区  ›  Hassam Abdelillah

从JBoss7迁移到WildFly9时使用CMT的EJB

  •  7
  • Hassam Abdelillah  · 技术社区  · 7 年前

    我正在将我的应用程序从JBoss7迁移到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
    

    这是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();
    }
    }
    

    我知道,如果我使用@TransactionManagement(transactionManagementType.bean)将事务管理更改为bmt,则会出现以下错误

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

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

    任何信息,请!

    1 回复  |  直到 7 年前
        1
  •  4
  •   Jon Sampson    6 年前

    这些更改在WildFly8中推出,并且(如下面所述)基于EJB3.1中全局JNDI名称空间的标准化。

    来自Wildfly 8 Developer Guide :

    EJB 3.1引入了标准化的全局JNDI命名空间和一系列映射到JavaEE应用程序的不同范围的相关命名空间。用于JNDI查找的三个JNDI命名空间是Java:Global、Java:Mead和Java:App。如果在应用程序中使用JNDI查找,则需要更改它们以遵循新的标准化JNDI名称空间约定。

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

    指南进一步说明:

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

    这是表中显示的一个片段 Examples of JNDI mappings in previous releases and how they might look now 特定于 UserTransaction :

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

    编辑回复:wflyejb0137:

    这是理论技巧,可能毫无价值-让我知道,我会删除它。 Java EE 6 Tutorial - Container-Managed Transactions 说:

    使用容器管理事务划分的企业bean也不能使用javax.transaction.userTransaction接口。

    进一步:

    (交易) 要求的 属性

    如果客户机在事务中运行并调用EnterpriseBean_s方法,则该方法在客户机_s事务中执行。如果客户机没有与事务关联,那么容器会在运行该方法之前启动一个新事务。

    必需的属性是使用容器管理的事务划分运行的所有企业bean方法的隐式事务属性。 除非需要重写另一个事务属性,否则通常不设置必需的属性。因为事务属性是声明性的,所以稍后您可以轻松地更改它们。

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

    wflyejb0137:只有具有bean管理事务划分的会话和消息驱动bean才允许访问usertransaction

    您的EJB使用的是容器管理事务(CMT)划分,它不与bean管理事务(BMT)划分交互操作,其中 用户事务 谎言。

    关于切换到BMT和

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

    我找到了 Transaction is required to perform this operation (either use a transaction or extended persistence context) 这似乎表明交易将由您管理,正如您在您的评论@marco中所指出的。您似乎已进行了适当的修改。