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:执行此操作需要事务(使用事务或扩展持久性上下文)
我想知道为什么我们必须首先改变这个?
请给我任何信息!
这些更改在 Wildfly 8 中推出,并且(如下所述)基于 EJB 3.1 中全局 JNDI 命名空间的标准化。
\n来自 Wildfly 8开发人员指南:
\n\n\nEJB 3.1 引入了标准化的全局 JNDI 命名空间和一系列映射到 Java EE 应用程序的各个范围的相关命名空间。用于可移植 JNDI 查找的三个 JNDI 命名空间是 java:global、java:module 和 java:app。如果您在应用程序中使用 JNDI 查找,则需要更改它们以遵循新的标准化 JNDI 命名空间约定。
\n为了符合新的可移植 JNDI 命名空间规则,您需要检查 JNDI 命名空间规则并修改应用程序代码以遵循这些规则。
\n
该指南进一步指出:
\n\n\nWildFly 8 加强了 JNDI 命名空间名称,为应用程序服务器中绑定的每个名称提供可预测且一致的规则,并防止将来出现兼容性问题。这意味着如果应用程序中的当前命名空间不遵循新规则,您可能会遇到问题。
\n
下面是表中的一个片段,显示了以前版本中的 JNDI 映射示例以及它们现在的具体外观UserTransaction:
\n\nRun Code Online (Sandbox Code Playgroud)\nPrevious 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
编辑回复:WFLYEJB0137:
\n这是理论技巧,可能毫无价值 - 请告诉我,我将删除它。Java EE 6 教程 - 容器管理事务说:
\n\n\n使用容器管理的事务划分的企业 Bean 也不得使用 javax.transaction.UserTransaction 接口。
\n
更远:
\n\n\n(交易)必需属性
\n如果客户端在事务中运行并调用企业 bean\xe2\x80\x99s 方法,则该方法在 client\xe2\x80\x99s 事务中执行。如果客户端未与事务关联,则容器在运行该方法之前启动一个新事务。
\nrequired 属性是使用容器管理的事务划分运行的所有企业 Bean 方法的隐式事务属性。除非您需要覆盖另一个事务属性,否则通常不会设置必需属性。由于事务属性是声明性的,因此您以后可以轻松更改它们。
\n
异常消息几乎说明了一切:
\n\n\nWFLYEJB0137:仅允许具有 Bean 管理事务划分的会话和消息驱动 Bean 访问 UserTransaction
\n
您的 EJB 使用容器管理事务 (CMT) 分界,该分界不与 Bean 管理事务 (BMT) 分界互操作,其中UserTransaction。
关于转向 BMT 和
\n\n\nWFLYJPA0060:需要事务来执行此操作(使用事务或扩展持久性上下文)
\n
我发现执行此操作需要事务(使用事务或扩展持久性上下文),这似乎表明事务将由您管理,正如您在评论@Marco 中指出的那样。看来你已经做了适当的修改。
\n| 归档时间: |
|
| 查看次数: |
457 次 |
| 最近记录: |